我正在尝试将django-autocomplete-light包括在我的项目中。一切都按预期工作,包括通过自动完成创建新选择。唯一的问题是我的模型包含多个字段,我仅在"名称"字段上使用自动完成。当我保存新的记录时,django-admin创建了数据库中具有相同名称的新对象,而不是更新已经由AutoComplete创建的记录。最后,我有两个记录,一个由AutoComplete创建的半空,一个由Django-Admin创建的有效。
models.py
class Montinent(models.Model):
name = models.CharField(max_length=250)
code = models.CharField(max_length=2, unique=True, db_index=True)
created = models.DateTimeField(auto_now_add=True)
class Meta:
ordering = ('-name',)
def __str__(self):
return self.name
views.py
class MontinentAutocomplete(autocomplete.Select2QuerySetView):
def get_queryset(self):
#Don't forget to filter out results depending on the visitor !
if not self.request.user.is_authenticated():
return Montinent.objects.none()
qs = Montinent.objects.all()
if self.q:
qs = qs.filter(name__istartswith=self.q)
return qs
urls.py
urlpatterns = [
url(r'^admin/', include(admin.site.urls)),
url(r'^montinent-autocomplete/$', MontinentAutocomplete.as_view(create_field='name'), name='montinent-autocomplete',),
]
admin.py
class MontinentForm(forms.ModelForm):
name = forms.ModelChoiceField(
queryset = Montinent.objects.all(),
widget = autocomplete.ModelSelect2(url='montinent-autocomplete')
)
class Meta:
model = Montinent
fields = ['name', 'slug', 'code']
class MontinentAdmin(admin.ModelAdmin):
form = MontinentForm
admin.site.register(Montinent, MontinentAdmin)
自动完成创建新选择的方式如下:
用户选择该选项时,自动完成脚本将使 将请求发布到视图。它应该创建对象并返回 PK,因此将添加该项目,就像已经有PK一样。
在这种情况下,看起来我需要覆盖默认的django-admin保存方法。我只是尝试制作"名称"字段unique
,但在这种情况下,Django说这个名称已经存在。
我的问题是如何覆盖我的模型中的默认保存方法。
我也在努力填写多个字段,并使用自动完整的创建选择。我需要包括正在创建新条目的用户。
将新条目保存到数据库中的方法是autocomplete.Select2QuerySetView
的create_object(text)
方法。您可以在文档中阅读有关此方法的更多信息,http://django-autocomplete-light.readthedocs.io/en/master/api.html
所以,要包括一个用户,我只是覆盖该方法如下:
def create_object(self, text):
return self.get_queryset().create(**{self.create_field: text, 'user' : self.request.user})
现在,您不需要使用自动完成的创建选项来部分填充表单。只需将其填充您想要的任何字段。