改变形式的ModelChoiceField初始值

时间:2012-12-06 18:42:50

标签: python django django-forms django-admin

首先是代码:

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

class CommentAdmin(admin.ModelAdmin):
    form    = CommentForm

当我正在编辑我的评论时,我希望它类别字段具有我最后一次保存时所选内容的初始值。我该怎么做?

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

form = CommentForm(instance = commentinstance)

commentinstance是您正在编辑的实例。

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

修改

如果您想在表单中执行此操作,则只需提供instance的{​​{1}}参数,如下所示:

__init__

如果您确实提供了一个默认def __init__(self, *args, **kwargs): instance = kwargs.pop('instance', YOUR_DEFAULT_INSTANCE) super(CommentForm, self).__init__(instance = instance, *args, **kwargs) ,那么它甚至会保留默认instance

答案 2 :(得分:0)

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

以前我是这样做的:

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

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