我有一个Person
模型,其中有一个ForeignKey
领域本身,叫mother
。 当用户进入到“添加”管理形式,我想定义的初始值mother
,万一有一个GET('mother')
参数,或将其留空,万一没有。
其实我也2个问题:
- 如何内访问请求
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:当然,我可能会问错了问题,所以我明白,解决这个问题的任何帮助。
我的解决方案:
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
哦,这恰好是比我想象的要容易得多。
如果你传递一个GET参数与现场为重点的名字命名的Django`s添加表单中,GET参数值将被设定为这一领域的初始值。
就我而言,我只是需要重定向到
本地主机/管理/程序my_app /人/添加/?&母亲= <ID>
没有必要操纵管理员或任何东西。
尝试重写get_form()方法的ModelAdmin:
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