2016-07-26 5 views
0

Я пытаюсь сохранить две формы при регистрации. Я могу видеть сохранение формы auth, но вторая форма не проходит .is_valid(). Не могли бы вы сообщить мне, что не так?Регистрационная форма save

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

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, 
    }) 

Я пытаюсь сохранить адрес электронной почты и пароль для AUTH_USER и school_id и телефон для отдельной таблицы ,

Всего наилучшего!

ответ

0

тестирование кода и того, что я столкнулся при отправке формы является

school_id value must be an integer 

Я предлагаю установить school_id/школу, чтобы быть 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) 

так что мы могли бы просто делать такие формы

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

также, я думаю, вам не нужно указывать t он формирует поля для UserForm, поскольку по умолчанию пользователю django требуется только пароль, имя пользователя и адрес электронной почты

0

Проблема в том, как работают двоичные ИИ. Если user_form.is_valid() возвращает False, оператор «if» помещает весь оператор как False без необходимости оценивать profile_form.is_valid(). Поэтому profile_form.is_valid() никогда не вызывается, а ошибки dict не будут заполнены. К сожалению, форма django is_valid() делает больше, чем просто возвращает логическое значение и имеет побочный эффект заполнения этих ошибок dict.

if user_form.is_valid() and profile_form.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 

выше гарантирует, что обе формы обрабатываются. Может быть, лучший способ выразить это, но это идея.

Смежные вопросы