Как изменить данные пользователя в Django
Я делаю Django проект, в котором пользователи могут зарегистрироваться, войти в систему, просмотреть свой профиль и изменить его, если захотят.
Я хочу знать, как реализовать функциональность изменения пользователем своего профиля?
Вот моя пользовательская форма в forms.py
class CustomerForm(forms.Form):
username = forms.CharField(label='Desired Username', max_length=150, validators=[validate_username])
first_name = forms.CharField(label='First Name', max_length=150)
last_name = forms.CharField(label='Last Name', max_length=150)
email = forms.EmailField(label='Your Email', validators=[validate_email])
password1 = forms.CharField(label='Enter Password', widget=forms.PasswordInput, min_length=8)
password2 = forms.CharField(label='Retype Password', widget=forms.PasswordInput, min_length=8)
def clean(self):
cleaned_data = super().clean()
password1 = cleaned_data.get("password1")
password2 = cleaned_data.get("password2")
if password1 != password2:
raise ValidationError(
"Passwords do not match"
)
Вот мой метод регистрации в views.py
"""Function for sign up."""
def sign_up(request):
if request.method == 'POST':
form = CustomerForm(request. POST)
if form.is_valid():
try:
user = User.objects.create_user(
request.POST['username'],
request.POST['email'], request.POST['password1']
)
user.first_name = request.POST['first_name']
user.last_name = request.POST['last_name']
user.save()
request.session['normal_username'] = request.POST['username']
login(request, user)
return redirect('../book/')
except Exception:
return HttpResponse("Something went wrong. Please try again.")
else:
context = {'form': form}
return render(request, 'sign_up.html', context)
context = {'form': CustomerForm()}
return render(request, 'sign_up.html', context)
Любая помощь будет оценена по достоинству.
Вам следует использовать включенную в Django UserCreationForm, вместо того, чтобы пытаться сделать все это самостоятельно - это значительно облегчит вам работу... Особенно когда дело доходит до подключения формы к модели пользователя.
Следуйте этому руководству для создания формы (ищите заголовок Sign Up With Extra Fields)
После того, как вы сделаете форму регистрации, вам будет довольно легко создать форму редактирования на основе этой базы:
def edituser(request):
# instance = request.user
# ^ Uses logged in user to pre-fill the form!
if request.method == 'POST':
form = SignUpForm(request.POST, instance=request.user)
if form.is_valid():
form.save()
username = form.cleaned_data.get('username')
raw_password = form.cleaned_data.get('password1')
user = authenticate(username=username, password=raw_password)
login(request, user)
return redirect('home')
data = {
'form': SignUpForm(instance=request.user)
}
return render(request, 'edituser.html', data)
# edituser.html would be a copy of the signup.html template!
# You might even be able to use the same template as the signup, but I'm not 100% sure
TLDR гида
- на случай, если связь когда-нибудь прервется
form.py
from django import forms
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.models import User
class SignUpForm(UserCreationForm):
first_name = forms.CharField(max_length=30, required=False, help_text='Optional.')
last_name = forms.CharField(max_length=30, required=False, help_text='Optional.')
email = forms.EmailField(max_length=254, help_text='Required. Inform a valid email address.')
class Meta:
model = User
fields = ('username', 'first_name', 'last_name', 'email', 'password1', 'password2', )
view.py
from django.contrib.auth import login, authenticate
from django.shortcuts import render, redirect
from mysite.core.forms import SignUpForm
def signup(request):
if request.method == 'POST':
form = SignUpForm(request.POST)
if form.is_valid():
form.save()
username = form.cleaned_data.get('username')
raw_password = form.cleaned_data.get('password1')
user = authenticate(username=username, password=raw_password)
login(request, user)
return redirect('home')
else:
form = SignUpForm()
return render(request, 'signup.html', {'form': form})
signup.html (шаблон)
{% extends 'base.html' %}
{% block content %}
<h2>Sign up</h2>
<form method="post">
{% csrf_token %}
{% for field in form %}
<p>
{{ field.label_tag }}<br>
{{ field }}
{% if field.help_text %}
<small style="color: grey">{{ field.help_text }}</small>
{% endif %}
{% for error in field.errors %}
<p style="color: red">{{ error }}</p>
{% endfor %}
</p>
{% endfor %}
<button type="submit">Sign up</button>
</form>
{% endblock %}
Если вы по каким-то причинам твердо решили не использовать ModelForm, я, вероятно, мог бы набросать пример с использованием нормальной формы (это было бы просто сложнее и намного больше работы)