Ich arbeite auf der Seite, wo Benutzer einige seiner Attribute wie Telefon bearbeiten kann.IntegrityError: App_userprofile.user_id möglicherweise nicht NULL
Das Problem besteht darin, dass diese Attribute entweder im integrierten Benutzermodul oder in seiner UserProfile
(user = OneToOneField(User)
) gespeichert werden können.
Also habe ich benutzerdefinierte Formulare zum Aktualisieren erstellt. Wenn Benutzer zu xxx/edit-profile
geht, werden diese Formulare von user
und user.userprofile
Instanzen gefüllt. Das Problem ist, da ich nicht alle Felder in dieser Form aufgenommen haben, dass während form.save()
wird Fehler ausgelöst wird:
IntegrityError: App_userprofile.user_id may not be NULL
klar sein, lege ich Formen, Modelle und Ausblick:
Forms:
class UserUpdateForm(forms.ModelForm):
class Meta:
model = User
fields = ('last_name','first_name',)
class UserProfileUpdateForm(forms.ModelForm):
class Meta:
model = UserProfile
fields = ('telephone',)
Ausblick:
@login_required
def edit_user(request):
user = request.user
user_profile = user.userprofile
if request.method=='POST':
user_profile_update_form = UserProfileUpdateForm(request.POST)
user_update_form = UserUpdateForm(request.POST)
if user_profile_update_form.is_valid() and user_update_form.is_valid():
user_update_form.save()
user_profile_update_form.save()
return render(request,'auth/profiles/my-profile.html')
else:
print user_profile_update_form.errors
print user_update_form.errors
else:
user_profile_update_form = UserProfileUpdateForm(instance=user_profile)
user_update_form = UserUpdateForm(instance=user)
return render(request,'auth/profiles/edit-profile.html',
context={'user_profile_update_form':user_profile_update_form,
'user_update_form':user_update_form})
MODELL:
class UserProfile(models.Model):
user = models.OneToOneField(User,on_delete=models.CASCADE,related_name='userprofile')
# ATRIBUTY KTORE BUDE MAT KAZDY
telephone = models.CharField(max_length=40,null=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)
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)
# OD KIAL STE SA O NAS DOZVEDELI
# A STAV
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)
Sie sollten wahrscheinlich Ihr Design überdenken. Es ist viel einfacher, eine benutzerdefinierte Benutzerunterklasse mit den gewünschten Feldern zu erstellen. –
@DanielRoseman Meinst du, dass es besser wäre, was UserProfile tun, aber anders? Ich würde mich freuen, wenn Sie mir zeigen, wie Sie das meinen. Danke –
Siehe die Dokumentation zu [Ersetzen eines benutzerdefinierten Benutzermodells] (https://docs.djangoproject.com/de/1.9/topics/auth/customizing/#substituting-a-custom-user-model). –