Django表单和MultipleChoiceField

时间:2012-07-18 14:14:27

标签: django forms

尝试创建一个表单,您可以在其中注册用户,并将自己添加到一个或多个类别。这样做时出错:

  

/ users / add-user /

中的TypeError      
    

'categories'是此函数的无效关键字参数

  

这是我的forms.py:

class AddUser(forms.Form):
    name = forms.CharField()
    title = forms.CharField()
    website = forms.CharField(required=False)
    email = forms.EmailField()
    phone = forms.CharField(required=False)
    company = forms.ModelChoiceField(queryset=Company.objects.all())
    categories = forms.ModelMultipleChoiceField(queryset=Category.objects.all())

最后一行是我遇到麻烦的。

这是我的views.py:

def add_user(request):
    if request.method == 'POST':
        form = AddUser(request.POST)
        if form.is_valid():
            cd = form.cleaned_data
            try:
                p = User.objects.get(email=cd['email'])
                error = "There's already a user with that e-mail adress registered. Maybe he/she is already here?"
                return render_to_response('users/add_user.html', {'form': form, 'error': error}, context_instance=RequestContext(request))
            except User.DoesNotExist:
                p = User(name=cd['name'], title=cd['title'], website=cd['website'], email=cd['email'], phone=cd['phone'], company=cd['company'], categories=cd['categories'])
                p.save()
            return HttpResponseRedirect('../thanks/')
    else:
        form = AddUser(request.POST)
        error = "You can't really submit empty forms. Try adding something useful :)"       
    return render_to_response('users/add_user.html', {'form': form}, context_instance=RequestContext(request))

如果有人对此问题有任何建议(或者甚至是改善我的代码的建议),我会很高兴的!我是Django的初学者,感谢所有的帮助。

2 个答案:

答案 0 :(得分:0)

你的问题在于:

p = User(name=cd['name'], title=cd['title'], website=cd['website'], email=cd['email'], phone=cd['phone'], company=cd['company'], categories=cd['categories'])

问题是User模型不包含类别字段,就像它不包含网站或公司一样。请参阅list of the available fields

与Django的auth系统结合使用处理附加数据有不同的方法。将用户类升级或向用户添加具有附加信息和一对一字段的模型。后一种选择似乎是suggested,所以我建议沿着这条道路前进。

答案 1 :(得分:0)

有点挑剔,但你确实要求其他建议。这一点:

else:
    form = AddUser(request.POST)

应该(IMO)改为:

else:
    form = AddUser()

没有必要使用request.POST来获取GET请求。我从来没有尝试过,但我猜它会起作用,你只是得到一个空集。所以不是错误,但可能是混乱的来源。

您的错误消息也未被使用。在这种情况下,页面上的GET根本不是错误,它只是页面最初的显示方式。