Django - Admin 中的 ForeignKey 字段初始值定义

Posted

技术标签:

【中文标题】Django - Admin 中的 ForeignKey 字段初始值定义【英文标题】:Django - ForeignKey field initial value definition in Admin 【发布时间】:2012-09-21 07:31:46 【问题描述】:

我有一个Person 模型,它本身有一个ForeignKey 字段,称为mother。 当用户进入“添加”管理表单时,我想为mother 定义一个初始值,以防有GET('mother') 参数,或者将其留空,以防没有。

我实际上有两个问题:

    如何访问ModelAdmin内的请求? 如何为ForeignKey 字段定义初始值?

在models.py中:

class Person(models.Model):
    name=models.CharField()
    mother=models.ForeignKey('self')

在 admin.py 中:

class  PersonAdminForm(forms.ModelForm):
    class Meta:
        model = Person

class PersonAdmin(admin.ModelAdmin):
    mother = request.GET.get('mother','') #don`t know how to access request

    if mother != '':
        form = PersonAdminForm
        form.initial='mother':Person.objects.get(id=mother)

好吧,这行不通。即使我只尝试定义一个硬编码的初始值,它也不起作用。

我做错了什么?

PS.:当然,我可能问错了问题,所以我感谢任何解决问题的帮助。

【问题讨论】:

【参考方案1】:

我的解决方案:

class PersonAdmin(admin.ModelAdmin):
    form = PersonAdminForm
    # ...
    def get_form(self, request, obj=None, *args, **kwargs):
        form = super(PersonAdmin, self).get_form(request, *args, **kwargs)
        # Initial values
        form.base_fields['mother'].initial = None
        if obj and obj.mother:
            form.base_fields['mother'].initial = obj.mother
        return form

【讨论】:

嗨,它也可以。而且它实际上更通用,所以我将这个设置为正确答案。我花了一段时间再次尝试类似的事情并找到你对我自己问题的答案:P 你为什么在课堂范围内使用form = PersonAdminForm 通常会添加一些自定义行为docs.djangoproject.com/en/1.8/ref/contrib/admin/…【参考方案2】:

哦,这比我想象的要容易得多。

如果您将字段名称作为键的 GET 参数传递给 Django 的添加表单,则 GET 参数值将设置为该字段的初始值。

就我而言,我只需要重定向到

localhost/admin/my_app/person/add/?&mother=

不需要操纵管理员或任何东西。

【讨论】:

【参考方案3】:

尝试覆盖 ModelAdmin 上的 get_form() 方法:

    class PersonAdmin(admin.ModelAdmin):
        form = PersonAdminForm

        def get_form(self, request, *args, **kwargs):
            form = super(PersonAdmin, self).get_form(request, *args, **kwargs)
            mother = request.GET.get('mother', None)
            if mother:
                form.initial = 'mother': Person.objects.get(id=mother)
            return form

【讨论】:

快到了!它用于访问请求。但是以某种方式定义初始值不起作用。既不是这种方式,也不是其他方式。我刚刚从 Django 1.3 升级到 1.4,但它并没有做得很好。

以上是关于Django - Admin 中的 ForeignKey 字段初始值定义的主要内容,如果未能解决你的问题,请参考以下文章

Django报错修复:1452, ‘Cannot add or update a child row: a foreign key constraint fails

在 django admin 中使用外键访问另一个模型字段

Django ORM批量操作和foreign key

Django之admin中管理models中的表格

Django 1.11 admin:创建 OneToOne 关系,它是 admin 中的对象

Django之admin