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