Django管理和自动完成指示灯-如何覆盖保存方法
我正试图在我的项目中加入Django autocomplete light。一切都按预期进行,包括通过autocomplete创建新选项。唯一的问题是我的模型包含多个字段,而我只在“name”字段上使用autocomplete。当我保存新记录时,django admin在数据库中创建同名的新对象,而不是更新自动完成已经创建的记录。最后我有两条记录,一条是由autocomplete创建的半空记录,另一条是由django admin创建的有效记录 型号.pyDjango管理和自动完成指示灯-如何覆盖保存方法,django,django-autocomplete-light,Django,Django Autocomplete Light,我正试图在我的项目中加入Django autocomplete light。一切都按预期进行,包括通过autocomplete创建新选项。唯一的问题是我的模型包含多个字段,而我只在“name”字段上使用autocomplete。当我保存新记录时,django admin在数据库中创建同名的新对象,而不是更新自动完成已经创建的记录。最后我有两条记录,一条是由autocomplete创建的半空记录,另一条是由django admin创建的有效记录 型号.py class Montinent(mode
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
视图.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
urlpatterns = [
url(r'^admin/', include(admin.site.urls)),
url(r'^montinent-autocomplete/$', MontinentAutocomplete.as_view(create_field='name'), name='montinent-autocomplete',),
]
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)
url.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
urlpatterns = [
url(r'^admin/', include(admin.site.urls)),
url(r'^montinent-autocomplete/$', MontinentAutocomplete.as_view(create_field='name'), name='montinent-autocomplete',),
]
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)
admin.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
urlpatterns = [
url(r'^admin/', include(admin.site.urls)),
url(r'^montinent-autocomplete/$', MontinentAutocomplete.as_view(create_field='name'), name='montinent-autocomplete',),
]
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)
自动完成创建新选项的方式如下:
def create_object(self, text):
return self.get_queryset().create(**{self.create_field: text, 'user' : self.request.user})
当用户选择该选项时,自动完成脚本将生成一个
将请求发布到视图。它应该创建对象并返回
pk,因此该项目将被添加,就像它已经有了pk一样
在这种情况下,看起来我需要重写默认的django admin save方法。我试图使“name”字段唯一
,但在本例中,Django说这个名称已经存在
我的问题是如何覆盖My models.py so django中的默认save方法,以使用从autocomplete pk返回的值,并将缺少的信息附加到行中,而不是创建新对象 我还努力用自动完成创建选项填充多个字段。我需要包括创建新条目的用户 将新条目保存到数据库中的方法是
autocomplete中的create\u object(text)
方法。选择2querysetview
。您可以在文档中阅读有关此方法的更多信息
因此,要包含一个用户,我只需覆盖该方法,如下所示:
def create_object(self, text):
return self.get_queryset().create(**{self.create_field: text, 'user' : self.request.user})
现在,您不需要使用“自动完成创建”选项部分填充表单。只要用你想要的任何字段来填充它