2014-02-23 42 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類):其餘代碼保持完全相同,並且用戶和帳戶實例仍將創建。

這就是說,我仍然不確定爲什麼該代碼應該給出該錯誤。您已排除用戶字段,因此它不應該要求它使表單有效。

相關問題