2017-05-21 3 views
0

ich das django Benutzermodell mit einem anderen Modell namens Profil erweitert:Django: Extended User Modell Cant speichern

class Profile(models.Model): 
    user = models.OneToOneField(User, on_delete=models.CASCADE) 
    chosenCharity = models.ForeignKey('meta.Charity', db_column='chosenCharityid', related_name='user_chosenCharity') 
    bio = models.TextField(max_length=500, blank=True) 
    location = models.CharField(max_length=30, blank=True) 
    birth_date = models.DateField(null=True, blank=True) 

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

@receiver(post_save, sender=User) 
def save_user_profile(sender, instance, **kwargs): 
    instance.profile.save() 

Wenn ich versuche, einen neuen Benutzer in der Ansicht mit dem Code erstellen unten ich die folgenden Fehlermeldung erhalten "(1048, "Spalte 'chosenCharityid' kann nicht null sein")":

@transaction.atomic 
def register(request): 
    selectedTeams = StraightredTeam.objects.filter(Q(teamid=request.session['team1id']) | Q(teamid=request.session['team2id'])).order_by('teamname') 
    request.POST.get('currentCharities') 

    next_url = request.POST.get('next', request.GET.get('next', reverse('straightred.payment'))) 
    if request.method == 'POST': 
     form = RegistrationForm(request.POST) 
     if form.is_valid(): 
      new_user = form.save() 

ich weiß, wenn ein Benutzer bereits erstellt hat, sollte ich in der Lage sein zu verwenden:

user = User.objects.get(pk=user_id) 
user.profile.chosenCharity = 12 
user.save() 

Aber ich bin mir nicht sicher, wie dies beim Erstellen des Benutzers zu tun ist. Jede Hilfe wäre willkommen.

Unten finden Sie eine Kopie des Anmeldeformulars zu helfen:

class RegistrationForm(BootstrapModelForm, UserCreationForm): 
    email_opt_in = forms.BooleanField(label='Receive DWAD e-mail updates', required=False) 

    def __init__(self, *args, **kwargs): 
     super(RegistrationForm, self).__init__(*args, **kwargs) 
     # The default Django user model doesn't require these fields to be set 
     # but we do. 

     self.fields['email'].required = True 

    def clean_email(self): 
     email = self.cleaned_data['email'] 
     if User.objects.filter(email__iexact=email).exists(): 
      raise ValidationError('There is already an account registered with this e-mail address.') 
     return email 

    class Meta: 
     model = User 
     fields = ['first_name', 'last_name', 'email', 'username'] 

Charity Modell: in post_save Signal

class Charity(models.Model): 
    name = models.CharField(max_length=50, unique=True) 
    website = models.URLField() 
    enabled = models.BooleanField(default=True) 

    def __unicode__(self): 
     return self.name 

    class Meta: 
     ordering = ['name'] 
     verbose_name_plural = 'charities' 
+0

chosenCharity nicht null sein kann, wenn das Profil Objekt in create_user_profile Signalempfänger zu speichern. Profil braucht eine Wohltätigkeits-ID. Wenn es optional ist, machen Sie im Feld selectedCharity null = True. –

+0

Hallo Zap, es ist nicht optional, aber ich weiß einfach nicht, wie man es in der Ansicht setzt. Irgendwelche Gedanken? –

+0

Haben Sie die Charity-ID in den request.POST-Daten verfügbar? Anstatt das post_save-Signal zu verwenden, können Sie direkt nach new_user = form.save() –

Antwort

1

schaffen nicht das Profilobjekt. Sie können nicht auf die erforderliche Charity-ID in der create_user_profile Methode zugreifen. Entfernen Sie diesen Teil des Codes.

speichern, anstatt das Profil Objekt rechts, nachdem Sie Ihren Benutzerobjekt in Ihrer register Ansicht wie folgt speichern:

@transaction.atomic 
def register(request): 
    selectedTeams = StraightredTeam.objects.filter(Q(teamid=request.session['team1id']) | Q(teamid=request.session['team2id'])).order_by('teamname') 
    request.POST.get('currentCharities') 

    next_url = request.POST.get('next', request.GET.get('next', reverse('straightred.payment'))) 
    if request.method == 'POST': 
     form = RegistrationForm(request.POST) 
     if form.is_valid(): 
      new_user = form.save() 
      charity_id = request.session['chosenCharityid'] 
      # create profile object 
      Profile.objects.create(user=new_user, chosenCharity_id=charity_id) 

EDIT:

Ich sehe, dass Sie eine andere Methode save_user_profile werden mit dem post_save Signal zu empfangen .

Verwenden Sie dies auch nicht. Es ist eine Runde um eine einfache direkte Sache zu tun.

Sie verwenden besitzen Codebeispiel:

user = User.objects.get(pk=user_id) 
# here you are assigning a new charity id to the profile object 
user.profile.chosenCharity = 12 
# you save the user object on which nothing has changed 
# instead you should save the profile object 
user.save() # no need 
user.profile.save() # direct and logical 
+0

Ich schätze Ihre Hilfe, aber das gibt mir nur "globalen Namen 'Profil' ist nicht definiert". –

+0

Wo ist das Profilmodell definiert? Können Sie überprüfen, ob es korrekt importiert wurde? –

+0

Da stimmt etwas mit meinem Charity-Modell nicht. Ignorieren Sie mich, während ich gehe das beheben :( –

Verwandte Themen