DJANGO ADMIN和AUTOCOLTETE -LIGHT-如何覆盖保存方法



我正在尝试将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.Select2QuerySetViewcreate_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})

现在,您不需要使用自动完成的创建选项来部分填充表单。只需将其填充您想要的任何字段。

最新更新