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

4
我有一个名为Person的模型,它有一个指向自身的ForeignKey字段,名为mother。 当用户进入“添加”管理员表单时,我想要为mother定义一个初始值,以防有GET('mother')参数,或留空,以防没有。
我实际上有两个问题:
  1. 如何在ModelAdmin中访问request
  2. 如何为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:当然,我可能问得不对,所以我感激任何解决问题的帮助。

3个回答

5
我的解决方案:
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

1
嗨,它也可以正常工作。实际上它更加灵活,所以我将其设置为正确答案。花了我一段时间再次尝试类似的东西并找到你对我的问题的答案:P - pedrovgp
为什么你在类作用域中执行 form = PersonAdminForm - a06e
通常要添加一些自定义行为 https://docs.djangoproject.com/en/1.8/ref/contrib/admin/#adding-custom-validation-to-the-admin - Moreno

1

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

如果您将一个GET参数作为Django添加表单的键名传递,那么该GET参数的值将被设置为该字段的初始值。

在我的情况下,我只需要重定向到

localhost/admin/my_app/person/add/?&mother=< id >

没有必要操作管理员或其他任何东西。


0
尝试在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,但它并没有起到任何作用。 - pedrovgp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接