我有一个Person
模型,其自身有一个ForeignKey
字段,名为mother
。
当用户转到“添加”管理表单时,我想定义mother
的初始值,以防有GET('mother')
参数,或者将其留空,以防万一。< / p>
我实际上有两个问题:
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:当然,我可能会问错误的问题,所以我感谢任何解决问题的帮助。答案 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