2016-07-26 19 views
0

私は2つのフォームを登録しようとしています。私はauthフォームの保存を見ることができますが、2番目のフォームは.is_valid()を渡しません。何が間違っているか教えてください。登録フォーム保存

Models.py

class School(models.Model): 
    id = models.IntegerField(primary_key=True) 
    Name = models.CharField(max_length=50, null=False) 
    Domain = models.CharField(max_length=50, null=False) 
    Mascot = models.ImageField(null=True, upload_to='mascot') 

    def delete(self, *args, **kwargs): 
     self.Mascot.delete() 
     super(School, self).delete(*args, **kwargs) 

    def __str__(self): 
     return self.Name 

class HeepooUser(models.Model): 
    user = models.OneToOneField(User) 
    phone = models.CharField(max_length=15, null=True) 
    allow_phone = models.BooleanField(default=False) 
    school_id = models.IntegerField() 
    date_join = models.DateTimeField(auto_now_add=True) 

forms.py

class UserForm(forms.ModelForm): 
    email = forms.EmailField(max_length=50, required=True) 
    password = forms.CharField(widget=forms.PasswordInput()) 

    class Meta: 
     model = User 
     fields = ('email', 'password') 


class RegisterForm(forms.ModelForm): 
    school_id = forms.ModelChoiceField(queryset=School.objects.all()) 
    phone = forms.CharField(max_length=15, min_length=10, required=False) 

    class Meta: 
     model = HeepooUser 
     fields = ('phone', 'school_id') 

私はAUTH_USERと別のテーブルにschool_idと電話してメールアドレスとパスワードを保存しようとviews.py

def register(request): 
    registered = False 
    if request.method == 'POST': 
     user_form = UserForm(request.POST) 
     profile_form = RegisterForm(request.POST) 

     if user_form.is_valid() and profile_form.is_valid(): 
      user = user_form.save(commit=False) 
      user.set_password(user.password) 
      user = user_form.save() 

      profile = profile_form.save(commit=False) 
      profile.user = user 
      profile = profile_form.save() 

      registered = True 
     else: 
      return HttpResponse('Wrong access1') 
    else: 
     user_form = UserForm() 
     profile_form = RegisterForm() 

    return render(request, "register.html", { 
     'user_form': user_form, 
     'profile_form': profile_form, 
     'registered': registered, 
    }) 

すべてベスト!

答えて

0

はあなたのコードをテストし、どのようなフォームを送信するとき、私が遭遇したことは、私は学校のモデルのFOREIGNKEY

class HeepooUser(models.Model): 
    user = models.OneToOneField(User) 
    phone = models.CharField(max_length=15, null=True) 
    allow_phone = models.BooleanField(default=False) 
    school_id = models.ForeignKey(School) 
    date_join = models.DateTimeField(auto_now_add=True) 

そうであることをschool_id /学校を設定することが示唆されてい

school_id value must be an integer 

です

class RegisterForm(forms.ModelForm): 
    class Meta: 
     model = HeepooUser 
     exclude = ('allow_phone', 'user') 

私もあなたはこのような形式をとることができると思います彼はデフォルトでdjangoユーザーはパスワード、ユーザー名、および電子メールのみを要求するので、彼はUserFormのフィールドを形成します

0

問題は、バイナリANDの仕組みにあります。 user_form.is_valid()がFalseを返す場合、 "if"文は、profile_form.is_valid()を評価する必要なしに、文全体をFalseとしてマークします。したがって、profile_form.is_valid()は呼び出されません.dictは読み込まれません。残念ながら、djangoのフォームis_valid()はブール値を返すだけではなく、そのエラーを取り込む副作用を持っています。

user_valid = False 
if user_form.is_valid(): 
    user_valid = True 

profile_valid = False 
if profile_form.is_valid(): 
    profile_valid = True 

if user_valid and profile_valid: 
    ... do something 

は、上記の両方の形式が処理を受けることを保証します:あなたが行うことができるかもしれない

if user_form.is_valid() and profile_form.is_valid(): 
    ... 

ことの一つは、このようなものです。それを表現するにはより良い方法があるかもしれませんが、それがアイデアです。

関連する問題