2016-07-26 1 views
0

두 개의 양식을 등록하려고합니다. auth 양식 저장을 볼 수 있지만 두 번째 양식은 .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

은 당신의 코드를 테스트하고 어떤 양식을 제출할 때 내가 만난 것은 내가 학교 모델의 외래 키

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') 

나는 또한 당신이 t를 지정할 필요가 없다고 생각한다. 그는 기본적으로 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(): 
    ... 

한 것은이 같은 것입니다. 그것을 표현하는 더 좋은 방법이 있을지 모르나 그것은 그 아이디어입니다.