【问题标题】:Django admin and autocomplete-light - how to override save methodDjango admin 和 autocomplete-light - 如何覆盖保存方法
【发布时间】: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


    【解决方案1】:

    我还在努力使用自动完成创建选项填充多个字段。我需要包括正在创建新条目的用户。

    将新条目保存到数据库中的方法是来自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})
    

    现在您不需要使用自动完成创建选项来部分填写表格。只需填写您想要的任何字段即可。

    【讨论】:

      猜你喜欢
      • 2016-07-26
      • 2020-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-26
      • 2010-09-15
      相关资源
      最近更新 更多