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

时间:2012-09-29 21:11:53

标签: django django-models django-forms django-admin django-modeladmin

我有一个Person模型,其自身有一个ForeignKey字段,名为mother。 当用户转到“添加”管理表单时,我想定义mother的初始值,以防有GET('mother')参数,或者将其留空,以防万一。< / p>

我实际上有两个问题:

  1. 如何访问ModelAdmin内的请求
  2. 如何定义ForeignKey字段的初始值?
  3. 在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 个答案:

答案 0 :(得分:4)

我的解决方案:

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 :(得分:1)

哦,它碰巧比我想象的容易得多。

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

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

本地主机/管理/程序my_app /人/添加/&安培;母亲= LT; id&gt;

无需操纵管理员或其他任何东西。

答案 2 :(得分: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
相关问题