对于我的应用程序,我使用用户组来表示一种用户类型。在我的特定情况下,用户只能在一个组中。在实施中,我有两个选择:
- 将 ManyToMany 覆盖为 ForeignKey
- 在我的表单上将 ManyToMany 表示为 MultipleChoiceField,只接受 1 个提交,然后从那里开始。
我选择了选项 2,因为有时让一个用户成为 2 个组的一部分对测试很有用(只是方便)。我认为两者在实施方面没有区别(但您的建议值得赞赏)。
在我看来,然后我编写代码将两者关联起来(这是 UserProfile 扩展类中的 ManyToMany) - 我不确定这是否有效。
我遇到的主要错误是表单不允许验证,并说 ManyToMany 需要一个“值列表”才能继续。
我有以下一组代码:
表格.py
from django.forms import ModelForm, Textarea
from django.contrib.auth.models import User, Group
from registration.models import UserProfile
from django import forms
from django.db import models
class RegistrationForm(ModelForm):
class Meta:
model = User
fields = ('username', 'password', 'email', 'first_name', 'last_name', 'groups')
widgets = {
'groups': forms.Select,
'password': forms.PasswordInput,
# 'text': Textarea(attrs = {'rows': 3, 'class': 'span10', 'placeholder': 'Post Content'}),
}
def __init__(self, *args, **kwargs):
super(RegistrationForm, self).__init__(*args, **kwargs)
self.fields['groups'].label = 'Which category do you fall under?'
视图.py
def get_registration(request):
if request.method == 'POST':
register_form = RegistrationForm(request.POST)
company_form = CompanyRegistrationForm(request.POST, request.FILES)
if register_form.is_valid() and company_form.is_valid(): # check CSRF
if (request.POST['terms'] == True):
new_user = register_form.save()
new_company = company_form.save()
new_profile = UserProfile(user = user, agreed_terms = True)
new_profile.companies_assoc.add(new_company)
new_profile.save()
return HttpResponseRedirect(reverse('companyengine.views.get_company'))
return render(request, 'registration/register.html', { 'register_form': register_form, 'company_form': company_form } )
else:
first_form = RegistrationForm
second_form = CompanyRegistrationForm
return render(request, 'registration/register.html', { 'register_form': register_form, 'company_form': company_form } )
和templates.html
<h2>Sign Up</h2>
<form action="/register" method="POST" enctype="multipart/form-data">{% csrf_token %}
<p>{{ register_form.non_field_error }}</p>
{% for field in register_form %}
<div class="control-group">
{{ field.errors }}
<label class="control-label">{{ field.label }}</label>
<div class="controls">
{{ field }}
</div>
</div>
{% endfor %}
<div id="company_fields">
<p>{{ register_form.non_field_error }}</p>
{% for field in company_form %}
<div class="control-group">
{{ field.errors }}
<label class="control-label">{{ field.label }}</label>
<div class="controls">
{{ field }}
</div>
</div>
{% endfor %}
</div>
<label><input type="checkbox" name="terms" id="terms"> I agree with the <a href="#">Terms and Conditions</a>.</label>
<input type="submit" value="Sign up" class="btn btn-primary center">
<div class="clearfix"></div>
</form>
一切似乎都加载得很好。但是表单不会通过 is_valid() 因为 Groups 字段需要“值列表”。我见过其他人问如何解析来自 TextField/TextArea 的信息,但我不明白为什么我需要拆分我的信息,因为它只有 1。
非常感谢您的建议。