Django管理和自动完成指示灯-如何覆盖保存方法

Django管理和自动完成指示灯-如何覆盖保存方法,django,django-autocomplete-light,Django,Django Autocomplete Light,我正试图在我的项目中加入Django autocomplete light。一切都按预期进行,包括通过autocomplete创建新选项。唯一的问题是我的模型包含多个字段,而我只在“name”字段上使用autocomplete。当我保存新记录时,django admin在数据库中创建同名的新对象,而不是更新自动完成已经创建的记录。最后我有两条记录,一条是由autocomplete创建的半空记录,另一条是由django admin创建的有效记录 型号.py class Montinent(mode

我正试图在我的项目中加入Django autocomplete light。一切都按预期进行,包括通过autocomplete创建新选项。唯一的问题是我的模型包含多个字段,而我只在“name”字段上使用autocomplete。当我保存新记录时,django admin在数据库中创建同名的新对象,而不是更新自动完成已经创建的记录。最后我有两条记录,一条是由autocomplete创建的半空记录,另一条是由django admin创建的有效记录

型号.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
视图.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})
现在,您不需要使用“自动完成创建”选项部分填充表单。只要用你想要的任何字段来填充它