Почему моя форма регистрации не работает? (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() вызывает класс для получения экземпляра класса.
Вернуться на верх