2017-05-03 3 views
1

Ich versuche, eine Registrierungsseite einzurichten, und ich habe ein Modell CafeUser, das als das Profil für das Benutzermodell dient. Ich habe ein Tutorial verwendet, um einen Signalempfänger einzurichten, so dass ich einen CafeUser für alle neuen registrierten Benutzer erstellen konnte.Django 1.10 IntegrityError auf Register

models.py:

class CafeUser(models.Model): 
    user = models.ForeignKey(User, unique=True, related_name="cafeuser") 
    phone_number = models.CharField(max_length=15) 
    birth_date = models.DateField('birthdate') 

def __str__(self): 
    return self.user.first_name + " " + self.user.last_name 



@receiver(post_save, sender=User) 
def update_user_profile(sender, instance, created, **kwargs): 
    if created: 
     CafeUser.objects.create(user=instance) 

views.py:

def register(request): 
    if request.method == 'POST': 
     form = SignUpForm(request.POST) 
     if form.is_valid(): 
      user = form.save() 
      user.refresh_from_db() 
      user.cafeuser.birth_date = form.cleaned_data.get('birth_date') 
      user.cafeuser.phone_number = form.cleaned_data.get('phone_number') 
      user.save() 

      raw_password = form.cleaned_data.get('password1') 
      user = authenticate(username=user.username, password=raw_password) 
      login(request, user) 
      return redirect('cafe:index') 
    else: 
     form = SignUpForm() 
    return render(request, 'cafe/register.html', {'form': form}) 

forms.py

class SignUpForm(UserCreationForm): 
    first_name = forms.CharField(max_length=30, required=False, help_text='Optional.') 
    last_name = forms.CharField(max_length=30, required=False, help_text='Optional.') 
    email = forms.EmailField(max_length=254, help_text='Required. Inform a valid email address.') 
    birth_date = forms.DateField(help_text='Rquired.') 
    phone_number = forms.CharField(max_length=15) 

    class Meta: 
     model = User 
     fields = ('username', 'first_name', 'last_name', 'email', 'password1', 'password2',) 

Wenn ich die Registrierung versuchen zu testen, wird der Benutzer erstellt, jedoch der CafeUser ist nicht:

IntegrityError at/register/null Wert in der Spalte "birth_date" verletzt Nicht-Null-Bedingung DETAIL: Failing Zeile enthält (7, 8, null,).

register.html:

<form method="post"> 
{% csrf_token %} 
{{ form.as_p }} 
<button type="submit" class="submit">Register</button> 
</form> 

Bitte lassen Sie mich wissen, wie diese zu beheben und alle anderen Tipps, die Sie könnten zur Verbesserung dieser Einheit von Code.

+0

Können Sie bitte das Formular Teil der HTML-Post? Es klingt wie Geburtsdatum wird nicht ordnungsgemäß gesendet. – Shadow

+0

Was ist das Ergebnis von 'form.cleaned_data.get ('birth_date')' '? Ich denke, es gibt 'Null'-Wert, deshalb erhalten Sie diesen Fehler –

+1

Es ist besser, zusätzliche Informationen zu der tatsächlichen Frage hinzufügen, anstatt durch Kommentare :) – Shadow

Antwort

0

Das Problem war, dass der CafeUser nicht speichern konnte. Basierend auf dem, was ich irgendwo in der Dokumentation gelesen habe, hatte ich gedacht, dass der Aufruf von user.save() automatisch save() auf dem Profilmodul aufrufen sollte - und ich bin mir immer noch nicht sicher, warum das nicht der Fall ist. So schrieb ich gerade den Anruf user.cafeuser.save() ich trotzdem:

if form.is_valid(): 
     user = form.save() 
     user.refresh_from_db() 

     user.cafeuser.birth_date = form.cleaned_data.get('birth_date') 
     user.cafeuser.phone_number = form.cleaned_data.get('phone_number') 
     user.cafeuser.save() # Apparently this had to be added 
     user.save() 

     raw_password = form.cleaned_data.get('password1') 
     user = authenticate(username=user.username, password=raw_password) 
     login(request, user) 
     return redirect('cafe:index')