【问题标题】:Django - ForeignKey field initial value definition in AdminDjango - Admin 中的 ForeignKey 字段初始值定义
【发布时间】:2012-09-21 07:31:46
【问题描述】:

我有一个Person 模型,它本身有一个ForeignKey 字段,称为mother。 当用户进入“添加”管理表单时,我想为mother 定义一个初始值,以防有GET('mother') 参数,或者将其留空,以防没有。

我实际上有两个问题:

  1. 如何访问ModelAdmin内的请求
  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.:当然,我可能问错了问题,所以我感谢任何解决问题的帮助。

【问题讨论】:

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


    【解决方案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,但它并没有做得很好。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-08
      • 2021-04-28
      • 1970-01-01
      • 2019-03-20
      • 2013-05-23
      • 1970-01-01
      相关资源
      最近更新 更多