Обновление UserProfile в Djanngo 1.11
Я новый разработчик, и мне было интересно, не могли бы вы помочь мне, обновив значения моего User/UserProfile через форму редактирования.
Сначала я не знал, но теперь я знаю, что мог бы расширить (по умолчанию) пользовательскую модель и, тем самым, избежать создания нового пользовательского профиля модели для целей профиля и упростить его (например, используя общие представления).
Поскольку я все еще учусь, я решил попробовать обходной путь, чтобы заставить себя задуматься, вместо того, чтобы просить о полном решении.
Я уже искал подобные вопросы здесь и в официальной документации Django, но так как я не следовал определенному рецепту, я не мог найти что-то, чтобы исправить это должным образом.
Вот что у меня так далеко:
models.py
class UserProfile(models.Model):
GENDER_CHOICES = (
('M', 'Masculino'),
('F', 'Feminino')
)
user = models.OneToOneField(User, on_delete=models.CASCADE)
profile_image = models.ImageField(upload_to='uploads/', blank=True, null=True)
gender = models.CharField(max_length=40, blank=True, null=True, choices=GENDER_CHOICES)
birthday = models.DateField(blank=True, null=True)
address = models.TextField(max_length=300, blank=True, null=True)
city = models.TextField(max_length=50, blank=True, null=True)
country = models.TextField(max_length=50, blank=True, null=True)
def __str__(self):
return str(self.id)
forms.py
class CustomUserForm(ModelForm):
class Meta:
model = User
fields = [
'username', 'id', 'first_name', 'last_name', 'email', 'last_login', 'date_joined'
]
widgets = {
'username': forms.TextInput(attrs={'class': 'form-control'}),
'id': forms.TextInput(attrs={'class': 'form-control', 'readonly': 'readonly'}),
'first_name': forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Insira seu nome'}),
'last_name': forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Insira seu sobrenome'}),
'email': forms.EmailInput(attrs={'class': 'form-control', 'placeholder': 'Insira seu email. Ex: seuemail@gmail.com'}),
'last_login': forms.DateInput(attrs={'class': 'form-control-plaintext rdonly', 'readonly': 'readonly'}),
'date_joined': forms.DateInput(attrs={'class': 'form-control-plaintext rdonly', 'readonly': 'readonly'}),
}
class UserProfileForm(ModelForm):
class Meta:
model = UserProfile
fields = [
'profile_image', 'gender', 'birthday', 'address', 'city', 'country'
]
widgets = {
'profile_image': forms.ClearableFileInput(attrs={'class': ''}),
'gender': forms.Select(attrs={'class': 'form-control'}),
'birthday': forms.DateInput(attrs={'class': 'form-control'}),
'address': forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Insira seu endereço completo'}),
'city': forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Insira sua cidade. Ex: Recife-PE'}),
'country': forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Informe o país em que vive'}),
}
views.py
class Profile(View):
def get(self, request, *args, **kwargs):
submitted = False
if request.user.is_authenticated():
# Getting the Target objects in the DB
targetuserprofile = UserProfile.objects.get(user=request.user)
# Instanciating forms and passing current values
profile_form = UserProfileForm(instance=targetuserprofile)
user_form = CustomUserForm(instance=request.user)
user_form.id = request.user.id
else:
return HttpResponseRedirect('/login/?next=/')
if 'submitted' in request.GET:
submitted = True
context = {
'user_form': user_form,
'profile_form': profile_form,
'submitted': submitted
}
return render(request, "registration/profile.html", context)
def post(self, request, *args, **kwargs):
submitted = False
# Creating new forms
profileform_formclass = UserProfileForm
userform_formclass = CustomUserForm
# Getting the values passed throught POST method
profile_form = profileform_formclass(request.POST, request.FILES)
user_form = userform_formclass(request.POST)
# Getting the Target objects in the DB
targetuserprofile = UserProfile.objects.filter(user=request.user)
targetuser = request.user
# Validating forms and saving
if profile_form.is_valid() & user_form.is_valid():
profile = profile_form.save(commit=False)
usr = user_form.save(commit=False)
targetuserprofile.user = targetuser
targetuserprofile.profile_image = profile.profile_image
targetuserprofile.gender = profile.gender
targetuserprofile.birthday = profile.birthday
targetuserprofile.address = profile.address
targetuserprofile.city = profile.city
targetuserprofile.country = profile.country
targetuserprofile.save()
targetuser.first_name = usr.first_name
targetuser.last_name = usr.last_name
targetuser.email = usr.email
targetuser.save()
else:
return HttpResponse("Erro")
submitted = True
context = {
'submitted': submitted
}
return render(request, "registration/profile.html", context)
profile.html (только соответствующие части)
<form action="" method="post" enctype="multipart/form-data">
{% csrf_token %}
{{ profile_form.profile_image }}
{{ user_form.first_name }}
{{ user_form.last_name }}
{{ user_form.email }}
{{ profile_form.gender }}
{{ profile_form.birthday }}
<label class="profile_readonly"></label>
{{ user_form.id }}
<label class="profile_readonly"></label>
{{ user_form.last_login }}
<label class="profile_readonly"></label>
{{ user_form.date_joined }}
{{ profile_form.address }}
{{ profile_form.city }}
{{ profile_form.country }}
<input class="btn btn-primary" type="submit" value="Salvar" />
</form>
Метод get (views.py) работает нормально, чтобы показать текущие значения User/UserProfile в форме, но пост- обновление не обновляет значения. Возможно, я что-то не так проверяю, поскольку получаю сообщение "Ошибка" из оператора else. Есть идеи, как мне правильно обновить мой User/UserProfile?