2014-02-23 39 views
0

我正在尝试为Django应用创建一个自定义用户,并且遇到了一个证明耗时的小问题。我将切入正题:ModelForm在用户创建之前需要用户:is_valid()返回false

我的Django的版本是1.6.2和2.7.4的Python

这里是模型

class Account(models.Model): 
    user = models.OneToOneField(User) 
    game_id = models.PositiveIntegerField(null=True, blank=True, default=None) 
    avatar = models.ImageField() 
    desc = models.CharField(max_length=2500, null=True, blank=True, default=None) 

的的ModelForm:

class RegistrationForm(ModelForm): 
     game_name = forms.CharField(label=(u'In Game Name')) 
     email = forms.EmailField(label=(u'Email Address')) 
     password = forms.CharField(label=(u'Password'), 
      widget=forms.PasswordInput(render_value=False)) 
     password1 = forms.CharField(label=(u'Verify Password'), 
      widget=forms.PasswordInput(render_value=False)) 

     class Meta: 
      model = Account 
      exclude = ('user',) 

     def clean_game_name(self): 
      username = self.cleaned_data['game_name'] 
      try: 
       User.objects.get(username=username) 
      except User.DoesNotExist: 
       return username 
      raise forms.ValidationError("That username is already taken, please select another.") 

     def clean(self): 
      if self.cleaned_data['password'] != self.cleaned_data['password1']: 
       raise forms.ValidationError("The passwords did not match. Please try again.") 
      return self.cleaned_data 

而且查看:

def account_registration(request): 
    if request.user.is_authenticated(): 
     return HttpResponseRedirect('/account/profile/') 
    if request.method == 'POST': 
     form = RegistrationForm(request.POST) 
     if form.is_valid(): # returns false 
      user = User.objects.create_user(
       username=form.cleaned_data['game_name'], 
       email=form.cleaned_data['email'], 
       password=form.cleaned_data['password']) 
      user.save() 
      member = Account(user=user) 
      member.save() 
      return HttpResponseRedirect('/account/profile/') 
     else: 
      print form.errors # output below 
      return render_to_response('account/register.html', {'form': form}, context_instance=RequestContext(request)) 
    else: 
     form = RegistrationForm() 
     context = {'form': form} 
     return render_to_response('account/register.html', context, context_instance=RequestContext(request)) 

输出打印:

user: This field is required. 

我如何可以提供RegistrationFormUser对象,不应该存在,直到登记表已经验证后?我对python和django都是全新的,所以我认为解决方案非常明显。

编辑:正如我在注释中添加模板

<form action="" method="post"> 
{% csrf_token %} 
{% if form.errors %}<p>Please correct the following fields:</p>{% endif %} 
<div class="register_div"> 
     {% if form.game_name.errors %}<p class="error">{{ form.game_name.errors }}</p>{% endif %} 
     <p><label for="game_name"{% if form.game_name.errors %} class="error"{% endif %}>In Game Name:</label></p> 
     <p>{{ form.game_name }}</p> 
</div> 
<div class="register_div"> 
     {% if form.email.errors %}<p class="error">{{ form.email.errors }}</p>{% endif %} 
     <p><label for="email"{% if form.email.errors %} class="error"{% endif %}>Email:</label></p> 
     <p>{{ form.email }}</p> 
</div> 
<div class="register_div"> 
     {% if form.password.errors %}<p class="error">{{ form.password.errors }}</p>{% endif %} 
     <p><label for="password"{% if form.password.errors %} class="error"{% endif %}>Password:</label></p> 
     <p>{{ form.password }}</p> 
</div> 
<div class="register_div"> 
     {% if form.password1.errors %}<p class="error">{{ form.password1.errors }}</p>{% endif %} 
     <p><label for="password1"{% if form.password1.errors %} class="error"{% endif %}>Verify Password:</label></p> 
     <p>{{ form.password1 }}</p> 
</div> 
<p><input type="submit" alt="register" /></p> 
</form> 
+0

该代码不应该给出该错误,因为您已将表单字段中的用户排除在外。你确定你使用的是精确的代码吗? (另外,我不确定你为什么使用ModelForm,因为你并没有真正使用任何Account域。) –

+0

是的,我肯定我正在使用该代码。我正在使用帐户类,因为我希望用户能够稍后添加这些内容,但不需要注册。而且因为我仍然想要所有内置的User类的好处。像身份验证等。 – robbmj

+0

你可以请添加你已经省略的代码吗? –

回答

1

,没有理由为这是一个ModelField的账户都没有。尽管您在有效子句中创建了一个帐户,但实际上并不是从表单本身的任何字段执行此操作。您应该将其设为正常形式(继承forms.Form并删除Meta类):其余代码保持完全相同,并且用户和帐户实例仍将创建。

这就是说,我仍然不确定为什么该代码应该给出该错误。您已排除用户字段,因此它不应该要求它使表单有效。

相关问题