2016-04-01 9 views
2

Ich versuche ein Registrierungsformular zu erstellen, das User und seine UserProfile registriert. Das Problem ist, dass Django besagt, dass username nicht verfügbar ist. Ich möchte (beide von integrierten in User und UserProfile)Unbekannte Felder (Benutzername) für UserProfile - Django

django.core.exceptions.FieldError: Unknown field(s) (username) specified for Use 
rProfile 

Ich möchte enthält alle Attribute bilden.

Was damit zu tun? Ich weiß, dass das Problem ist, weil ich UserCreationForm.Meta.fields hinzugefügt habe, aber wie man es funktioniert? Dies scheint eine klare und einfache Lösung zu sein.

Dies ist die Form:

class UserProfileCreationForm(UserCreationForm): 
    password1 = forms.CharField(label="Password", widget=forms.PasswordInput) 
    password2 = forms.CharField(label="Password confirmation", widget=forms.PasswordInput) 

    class Meta(UserCreationForm.Meta): 
     model = UserProfile 
     fields = UserCreationForm.Meta.fields + ('date_of_birth','telephone','IBAN',) 

    def clean_password2(self): 
     # Check that the two password entries match 
     password1 = self.cleaned_data.get("password1") 
     password2 = self.cleaned_data.get("password2") 
     if password1 and password2 and password1 != password2: 
      msg = "Passwords don't match" 
      raise forms.ValidationError("Password mismatch") 
     return password2 

    def save(self, commit=True): 
     user = super(UserCreationForm, self).save(commit=False) 
     user.set_password(self.cleaned_data["password1"]) 
     if commit: 
      user.save() 
     return user 

USERPROFILE MODUL:

class UserProfile(models.Model): 
    user = models.OneToOneField(User, related_name='user_data') 
    date_of_birth = models.DateField() 
    telephone = models.CharField(max_length=40) 
    IBAN = models.CharField(max_length=40) 
    created = models.DateTimeField(auto_now_add=True) 
    modified = models.DateTimeField(auto_now=True) 

    MARITAL_STATUS_CHOICES = (
     ('single', 'Single'), 
     ('married', 'Married'), 
     ('separated', 'Separated'), 
     ('divorced', 'Divorced'), 
     ('widowed', 'Widowed'), 
    ) 
    marital_status = models.CharField(max_length=40, choices=MARITAL_STATUS_CHOICES, null=True, blank=True) 

    HOW_DO_YOU_KNOW_ABOUT_US_CHOICES = (
     ('coincidence', u'It was coincidence'), 
     ('relative_or_friends', 'From my relatives or friends'), 
    ) 
    how_do_you_know_about_us = models.CharField(max_length=40, choices=HOW_DO_YOU_KNOW_ABOUT_US_CHOICES, null=True, 
               blank=True) 

    # TRANSLATOR ATTRIBUTES 

    is_translator = models.BooleanField(default=False) 

    language_tuples = models.ManyToManyField(LanguageTuple) 

    rating = models.IntegerField(default=0) 

    number_of_ratings = models.BigIntegerField(default=0) 

    def __unicode__(self): 
     return '{} {}'.format(self.user.first_name, self.user.last_name) 

    def __str__(self): 
     return '{} {}'.format(self.user.first_name, self.user.last_name) 

Antwort

2

Da der Fehler sagt, kann das fields Attribut enthalten nur die Felder aus dem Modell das Formular auf basiert, die in In diesem Fall handelt es sich um UserProfile. Sie können die Benutzerfelder nicht auf diese Weise einschließen. Stattdessen müssen Sie sie manuell auf Klassenebene angeben, wie Sie es mit password1/password2 getan haben. Auch müssen Sie etwas mit ihnen in der save Methode tun.

Anstatt all dies zu tun, ist es möglicherweise besser, ein benutzerdefiniertes Benutzermodell zu erstellen, das die Felder von User und UserProfile enthält. Auf diese Weise haben Sie nur ein Modell, und alle Felder werden automatisch in das UserCreationForm aufgenommen.

+0

Danke Daniel. Also meinst du, ich sollte einen CustomUserMode erstellen (User, UserProfile): pass? Funktionieren Authentifizierung und ähnliches so, wie es funktionieren sollte? –

Verwandte Themen