Django中动态生成表单选项

4
在Django中,我有一个用于提交新文章的表单。在此表单中,您可以将文章放置在“用户组”中,这只是组和用户之间的多对多关系。但是,您只能将其添加到属于您所属的组中。使用表单类的init函数,我可以传递一个额外的字段,并且我确实得到了所需的正确选项,但是在提交时,我遇到了错误“'QueryDict' object has no attribute 'all'”。
这里是我的表单,我不确定出了什么问题:
class PostForm(BaseModelForm):
new_image = forms.ImageField(required=False)
#GROUPS = user.groups.all()
#group = forms.ChoiceField(choices=GROUPS, required=False )

def __init__(self,groups, *args, **kwargs):
    super(PostForm, self).__init__(*args, **kwargs)
    self.fields['group'].queryset = groups

    class Meta:
        model = Post
        fields = ('title','category', 'group', 'text', 'description', 'style')

        help_texts = {
            'group': _('Do you want this published under your account or a group?')
        }

以下是出错的视图:

@login_required
def post_new(request):
    if request.method == "POST":
        form = PostForm(request.POST, request.FILES)
        if form.is_valid():
            post = form.save(commit=False)
            post.author = request.user
            post.save()
            return redirect('post_detail', pk=post.pk)
    else:
        form = PostForm(groups=request.user.user_groups.all())
    return render(request, 'blog/post_edit.html', {'form': form})

这一行:

form = PostForm(groups=request.user.user_groups.all())

这里是我传入组选项的位置,它确实给出了正确的选项。错误发生在提交时使我想到视图处理它的方式有误,但我不确定具体在哪个环节出错了。


1
请修复缩进。具体来说,不清楚 class Meta 是否应该嵌套在 class PostForm 中。 - mkrieger1
你的模型表单应该继承 models.ModelForm,而不是 BaseModelForm - Alasdair
BaseModelForm是我正在使用的扩展,用于向表单添加Bootstrap类。 - Owen Percoco
这是一个令人困惑的名称,因为 Django 有一个 BaseModelForm,你不应该使用它。 - Alasdair
2个回答

1

您需要为GETPOST请求向表单传递groups。目前,您只对GET请求这样做。应该是:

if request.method == "POST":
    form = PostForm(request.user.user_groups.all(), request.POST, request.FILES)
    ...

我认为这个方法和其他答案结合起来就可以解决问题了。 - Owen Percoco

1
我认为您需要以以下形式查询组:
class PostForm(models.ModelForm):
    group = forms.ChoiceField(queryset = None)

    def __init__(self,groups, *args, **kwargs):
        super(PostForm, self).__init__(*args, **kwargs)
        self.fields['group'].queryset = request.user.user_groups.all()

https://docs.djangoproject.com/en/1.11/ref/forms/fields/#fields-which-handle-relationships

重要的是将queryset定义为None,并在__init__中创建表单实例时进行查询。


尝试了这个解决方案后,我仍然遇到了之前相同的查询集错误。 - Owen Percoco

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接