2016-07-26 14 views
0

Ich versuche, zwei Formulare in der Registrierung zu speichern. Ich kann sehen, dass die Auth-Form sicher ist, aber die zweite Form ist nicht pass .is_valid(). Können Sie mir bitte mitteilen, was falsch ist?Registrierungsformular speichern

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

Ich versuche, E-Mail und Passwort zu speichern, um AUTH_USER und school_id und Telefon separate Tabelle .

Alles Gute!

Antwort

0

getestet Code und was ich erlebt habe, wenn ein Formular abgeschickt ist

school_id value must be an integer 

Ich schlage school_id/Schule setzen

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) 

so ein foreignKey des Schulmodell zu sein dass wir einfach die Formulare wie diese

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

auch tun können, ich denke, Sie müssen nicht angeben, t er Formularfelder für UserForm, da der Django-Benutzer standardmäßig nur ein Passwort, einen Benutzernamen und eine E-Mail benötigt

0

Das Problem ist, wie binäre ANDs arbeiten. Wenn user_form.is_valid() False zurückgibt, markiert die "if" -Anweisung die gesamte Anweisung als False, ohne profil_form.is_valid() auswerten zu müssen. Daher wird profile_form.is_valid() niemals aufgerufen, und die Fehler werden nicht aufgefüllt. Unglücklicherweise liefert djangos Formular is_valid() mehr als nur einen booleschen Wert zurück und hat den Nebeneffekt, diese Fehler dict zu füllen.

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

Eine Sache, die Sie vielleicht so etwas wie dies tun können, ist:

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 

Die oben stellt sicher, dass beide Formen verarbeitet bekommen. Es könnte einen besseren Weg geben, es auszudrücken, aber das ist die Idee.

Verwandte Themen