Почему моя форма регистрации не работает? (Django Framework)
Я создаю сайт с помощью Django. Почему-то я не могу зарегистрироваться как пользователь, так как всегда получаю следующее сообщение об ошибке:
UnboundLocalError at /register/ локальная переменная 'context' упоминается до присвоения
views.py
def register(request):
if request.method == 'POST':
form = UserRegisterForm(request.POST)
pform = UserProfileForm(request.POST)
if form.is_valid() and pform. is_valid():
user = form.save()
profile = pform.save(commit=False)
profile.user = user
profile.save()
username = form.cleaned_data.get('username')
messages.success(request, f'Your account has been created! You are now able to login')
return redirect('login')
else:
context = {
'form': UserRegisterForm,
'p_form': UserProfileForm
}
return render(request, 'users/register.html', context)
register.html
{% load crispy_forms_tags %}
{% block content %}
<div class="content-section">
<form method="POST">
{% csrf_token %}
<fieldset class="form-group">
<legend class="border-bottom mb-4">Join Today</legend>
{{ form|crispy }}
</fieldset>
<div class="form-group">
<button class="btn btn-outline-info" type="submit">Sign Up</button>
</div>
</form>
<div class="border-top pt-3">
<small class="text-muted">Already have an Account? <a class="ml-2" href="{% url 'login' %}">Sign In</a></small>
</div>
</div>
{% endblock content %}
Есть ли у кого-нибудь идея, почему мой контекст является ложным или не будет принят?
Потому что вы передаете контекст в операторе else, поэтому он не будет принят.
Изменить это:
else:
context = {
'form': UserRegisterForm,
'p_form': UserProfileForm
}
К этому:
context = {
'form': form,
'p_form': p_form
}
И ваши представления выглядят следующим образом:
def register(request):
if request.method == 'POST':
form = UserRegisterForm(request.POST)
p_form = UserProfileForm(request.POST)
if form.is_valid() and p_form.is_valid():
user = form.save()
profile = pform.save(commit=False)
profile.user = user
profile.save()
username = form.cleaned_data.get('username')
messages.success(request, f'Your account has been created! You are now able to login')
return redirect('login')
else:
form = UserRegisterForm()
p_form = UserProfileForm() #Here you made mistake
context = {
'form': form,
'p_form': p_form
}
return render(request, 'users/register.html', context)
Здесь:
context = {
'form': UserRegisterForm,
'p_form': UserProfileForm
}
вы возвращаете фактические классы, а не экземпляр классов, который будет вашей формой.
Кроме того, вы фактически не устанавливаете context
в первой части if
, поэтому ее нужно полностью вынести за пределы условного выражения.
Вам нужно вернуть то, что вы определили:
else:
form = UserRegisterForm()
pform = UserProfileForm()
context = {
'form': form,
'p_form': pform,
}
Обратите внимание, что разница находится в скобках ...
UserProfileForm
- это просто объект класса.UserProfileForm()
вызывает класс для получения экземпляра класса.