2016-04-21 9 views
0
class CustomAccount(models.Model): 
     user = models.OneToOneField("auth.User") 
     role = models.CharField(max_length = 50, default = 'student', choices=APPROVAL_CHOICES) 
     balance = models.FloatField(default = 0) 
     timezone = models.CharField(max_length = 200) 
     def __str__(self): 

      return self.user.username +" ["+ self.role + "]" 

    class CustomAccountForm(forms.ModelForm): 
     username = forms.CharField(max_length=30) 
     email = forms.EmailField(max_length=255) 
     password1 = forms.CharField(label= "Password",widget=forms.PasswordInput()) 
     password2 = forms.CharField(label="Password confirmation", widget=forms.PasswordInput , help_text="Enter the same password as above, for verification.")  

     def save(self, commit= True): 
      user = User.objects.create_user(username = self.cleaned_data['username'], email = self.cleaned_data['email'] , password = self.cleaned_data['password1']) 
      user.save() 
      self.user = user 
      return super(CustomAccountForm, self).save(commit=commit) 

     def clean_username(self): 
      username = self.cleaned_data["username"] 
      try: 
       User.objects.get(username=username) 
      except User.DoesNotExist: 
       return username 
      raise forms.ValidationError("A user with that username already exists.") 

     def clean_password2(self): 
      password1 = self.cleaned_data.get("password1", "") 
      password2 = self.cleaned_data["password2"] 
      if password1 != password2: 
       raise forms.ValidationError("The two password fields didn't match.") 
      return password2 
     def clean_email(self): 
      email = self.cleaned_data["email"] 
      try: 
       User.objects.get(email=email) 
      except User.DoesNotExist: 
       return email 
      raise forms.ValidationError("A user with that emailaddress already exists.")  
     class Meta: 
      model = CustomAccount  
      exclude = ['balance','user'] 

Ich möchte benutzerdefinierte Konto in Django Admin-Abschnitt mit einzelnen Formular erstellen, die Felder von auth.User und CustomAccount Model hat. Ich habe immer Fehler IntegrityError bei/admin/myLogin/customaccount/add/ NOT NULL fehlgeschlagen: mylogin_customaccount.user_idSo füllen Sie zwei Modelle mit einzelnen Formular

+0

Haben Sie in diesem Kundenkonto Tabelle vor bevölkerten Daten haben? –

+0

Ja, ich habe zwei Objekte –

+0

Wenn der Benutzer ein Fremdschlüssel ist, könnte ich vorschlagen, dass Sie im Benutzerfeld 'null = True' hinzufügen. Wenn Sie OneToOne mit dem Benutzer verbinden, können Sie nicht 'null = True' anwenden, ich würde vorschlagen, dass Sie die zwei Datensätze in der Datenbank löschen und versuchen, die Migration anzuwenden –

Antwort

0

Da Sie eine nicht null Fehler bekommen, ich glaube, Sie angeben müssen, dass das Feld nicht erforderlich ist. Hier ist ein Beispiel aus einer meiner Apps. Dies besagt, dass das Formularfeld nicht erforderlich ist.

class arunModelForm(forms.ModelForm): 
    def __init__(self, *args, **kwargs): 
     myuser = kwargs.pop('user', None) 
     super(arunModelForm, self).__init__(*args, **kwargs) 

     self.fields['nanoadded'].required = False 
     self.fields['response'].required = False 

ich dies auch in meiner Modelle enthalten, so dass meine Modellfelder null sein kann, wie folgt aus:

class arun(models.Model): 
    auser = models.CharField(max_length=50, null=True) 
    adate = models.DateField(null=True) 
    atime = models.TimeField(null=True) 

Wenn ich noch nicht null Fehler erhalten, nachdem ich diese beiden Dinge tun, ich füllen das Feld mit einem Platzhalterwert, um das Problem weiter untersuchen zu können.

+0

was du gesagt hast ist nur korrekt wenn es ein FK ist, du kannst nicht 'null = True' haben zu OnetoOne Feld –

0

Sie haben den Benutzer aus dem Formular entfernt und in der Speichermethode haben Sie self.user in save method zugewiesen. Beim Speichern des Formulars wird daher das Benutzerattribut nicht für CustomAccountForm und das Benutzerfeld für CustomAccount ist None verwendet.

Ihre speichern Methode sollte wie folgt aussehen:

def save(self, commit= True): 
    user = User.objects.create_user(username =self.cleaned_data['username'], email = self.cleaned_data['email'] ,  password = self.cleaned_data['password1']) 
    user.save() 
    obj = super(CustomAccountForm, self).save(commit=False) 
    obj.user = user 
    obj.save() 
+0

Jetzt bekomme ich UNIQUE Constraint fehlgeschlagen: mylogin_customaccount.user_id Fehler –

+0

Es bedeutet, Sie erstellen mehrere CustomAccount-Objekt mit demselben Benutzer. –

+0

Wie das möglich sein könnte Ich erstelle neue Benutzer vor dem Speichern jedes Mal –

Verwandte Themen