【发布时间】:2017-05-09 07:30:07
【问题描述】:
我正在尝试在我的项目中包含 Django-autocomplete-light。一切都按预期工作,包括通过自动完成创建新选择。唯一的问题是我的模型包含多个字段,并且我仅在“名称”字段上使用自动完成功能。当我保存我的新记录时,django-admin 在数据库中创建具有相同名称的新对象,而不是更新已由自动完成创建的记录。最后我有两条记录,一条由自动完成创建半空,一条由 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)
自动完成创建新选择的方式如下:
当用户选择该选项时,自动完成脚本会生成一个 对视图的 POST 请求。它应该创建对象并返回 pk,因此该项目将被添加,就像它已经有一个 PK 一样。
在这种情况下,我似乎需要覆盖默认的 django-admin 保存方法。我试图创建“名称”字段unique,但在这种情况下,Django 说这个名字已经存在。
我的问题是如何覆盖我的 models.py 中的默认保存方法,以便 django 使用从自动完成 pk 返回的并将缺少的信息附加到行而不是创建新对象?
【问题讨论】:
标签: django django-autocomplete-light