Django中动态生成的表单选择

时间:2017-04-25 13:08:57

标签: python django forms

我有一个用于在Django中提交新文章的表单,在此表单中,您可以将帖子放入“用户组”,只是组和用户之间的许多关系。但是,您只能将其添加到您所属的群组中。使用表单类的init函数我可以传入一个额外的字段,我确实得到了我需要的正确选择,但是在提交时我得到一个错误' QueryDict'对象没有属性'所有'

我不确定哪里出错了,继承人的形式:

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())

我在哪里传递组的选择,这确实为您提供了正确的选择。在提交时发生错误的事实使我认为视图处理它的错误,但我不知道在哪里。

2 个答案:

答案 0 :(得分:1)

您需要将groups传递给GETPOST请求的表单。目前你只是为GET请求做这件事。它应该是

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

答案 1 :(得分: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__在创建表单实例时进行查询。