我有一个用户模型(由Django预定义)和一个通过外键连接的UserProfile模型。
我正在创建两个单独的模型表单,以在单个模板中用作各种注册表单。
models.py
class UserProfile(models.Model):
# This field is required.
user = models.ForeignKey(User, unique=True, related_name="connector")
location = models.CharField(max_length=20, blank=True, null=True)
forms.py
class UserForm(ModelForm):
class Meta:
model = User
class UserProfileForm(ModelForm):
class Meta:
model = UserProfile
但是,当我加载页面并填写表单信息时,UserProfileForm 要求我选择/填写用户字段以进行验证。
但是,这个"用户"是现在正在创建的那个,所以我无法选择"用户",因为它尚未创建/仍在创建中。
我知道这个用户是字段具有属性 unique=true,但有办法使这个字段"可选"?
我的视图(如下)应该处理它,一旦创建了用户对象,我将 UserProfile 的外键设置为这个新创建的用户对象(除非我的 views.py 也做错了什么)。
views.py
@csrf_protect
def register(request):
if request.method == 'POST':
form1 = UserForm(request.POST)
form2 = UserProfileForm(request.POST)
if form1.is_valid() and form2.is_valid():
#create initial entry for user
username = form1.cleaned_data["username"]
password = form1.cleaned_data["password"]
new_user = User.objects.create_user(username, password)
new_user.save()
#create entry for UserProfile (extension of new_user object)
profile = form2.save(commit = False)
profile.user = new_user
profile.save()
return HttpResponseRedirect("/books/")
else:
form1 = UserForm()
form2 = UserProfileForm()
c = {
'form1':form1,
'form2':form2,
}
c.update(csrf(request))
return render_to_response("registration/register.html", c)
你可以设置:
user = models.ForeignKey(User, unique=True, blank=True, null=True, related_name="connector")
这将使用户关系成为可选的,但我认为这不是您需要的。相反,为什么不直接从UserProfile
窗体中删除user
字段并手动分配它,而不是让用户看到下拉列表。这样就不会有验证错误。
class UserProfileForm(ModelForm):
class Meta:
model = UserProfile
exclude = ("user", )
只需从表单中排除该字段即可。
class UserProfileForm(ModelForm):
class Meta:
model = UserProfile
exclude = ('user',)