【问题标题】:ModelChoiceField initial value in change form变更表单中的 ModelChoiceField 初始值
【发布时间】:2012-12-06 18:42:49
【问题描述】:

首先是代码:

class CommentForm(forms.ModelForm):
    categories = forms.ModelChoiceField(queryset = Category.objects.all(), required = False)

class CommentAdmin(admin.ModelAdmin):
    form    = CommentForm

当我编辑我的评论时,我希望类别字段具有我上次保存时选择的初始值。我该怎么做?

【问题讨论】:

    标签: python django django-forms django-admin


    【解决方案1】:
    def get_form(self, *args, **kwargs):
            f = super(CommentAdmin, self).get_form(*args, **kwargs)
            f.base_fields['categories'].initial = 1
    
            return f
    

    这个放在 CommentAdmin 中的代码起到了作用...

    编辑:

    def __init__(self, *args, **kwargs):
            super(CommentForm, self).__init__(*args, **kwargs)
    
            self.fields['categories'].initial = self.instance.object_id
    

    或者这段代码放在 CommentForm 中

    【讨论】:

      【解决方案2】:

      您希望在生成的表单中默认选择当前模型值吗?如果是这种情况,我认为您在视图中寻找的是

      form = CommentForm(instance = commentinstance)
      

      commentinstance 是您正在编辑的实例。

      (如果是 POST 请求,则为 form = CommentForm(request.POST, instance = commentinstance)

      编辑

      如果您想在表单中执行此操作,只需提供来自 __init__instance 参数,如下所示:

      def __init__(self, *args, **kwargs):
          instance = kwargs.pop('instance', YOUR_DEFAULT_INSTANCE)
          super(CommentForm, self).__init__(instance = instance, *args, **kwargs)
      

      如果您确实在视图中提供了instance,这甚至会保留默认的instance

      【讨论】:

      • 我实际上是在寻找一种解决方案来覆盖 CommentAdmin(或 CommentForm)init 方法。由于我在管理面板中执行此操作,因此我不想编写任何视图函数。类似:self.categories = forms.ModelChoiceField(queryset = Category.objects.all(), required = False, initial = {'categories': instance_of_mymodel.pk }) 如果这有意义的话:P
      • 换句话说:我想将我的代码插入到初始化表单的代码中。
      • 3 年后,添加了您的请求。我认为这是最简单的方法。一般来说,最好在视图中做,但对于特殊情况,您可以使用这个...
      【解决方案3】:

      我想有几种方法可以解决这个问题。

      这是我之前的做法:

      class MyForm(forms.ModelForm):
          def __init__(self, *args, **kwargs):
              if 'ref' in kwargs:
                  ref = kwargs['ref']
                  item = MyModel.objects.get(pk=ref)
                  kwargs['instance'] = item
      
              super(MyForm, self).__init__(*args, **kwargs)
      
           class Meta:
               model = MyModel
      

      重要的部分是将填充的模型对象放入关键字变量实例中。

      【讨论】:

        猜你喜欢
        • 2010-11-23
        • 1970-01-01
        • 1970-01-01
        • 2021-07-20
        • 2019-03-01
        • 2015-10-22
        • 1970-01-01
        • 2013-06-11
        • 1970-01-01
        相关资源
        最近更新 更多