Регистрация Django и вход в систему на той же странице указателя - PullRequest
0 голосов
/ 08 июля 2019

Я пытаюсь создать регистрационную форму и форму входа на моей странице индекса (НЕ отдельные адреса входа / регистрации).Я могу отображать формы, но у меня проблемы с отправкой.Сначала у меня была просто форма регистрации и представление для создания учетной записи, но добавление формы для входа стало вызывать некоторые проблемы.Относительно новичок в Django и, похоже, не могу найти документацию, подходящую для моего варианта использования.

views.py

from django.shortcuts import render, redirect
from django.contrib.auth.forms import UserCreationForm
from .forms import UserRegisterForm
from django.contrib.auth.forms import AuthenticationForm
from django.contrib.auth import authenticate, login, logout
from django.contrib import messages
import datetime
from django.http import HttpResponseRedirect, HttpResponse
from django.urls import reverse
from django.contrib.auth.decorators import login_required


def index(request):
    if request.method == 'POST':
      if request.POST.get('submit') == 'login':
          login_form = AuthenticationForm(request.POST)
          username = request.POST.get('username')
          password = request.POST.get('password')
          user = authenticate(username=username, password=password)
          if user:
              if user.is_active:
                  login(request,user)
                  return HttpResponseRedirect(reverse('index'))
              else:
                  return HttpResponse("Your account was inactive.")
          else:
              return HttpResponse("Invalid login details given")

      elif request.POST.get('submit') == 'register':
          form = UserRegisterForm(request.POST)
          if form.is_valid():
            form.save()
            username = form.cleaned_data.get('username')
            messages.success(request, f'Account created for {username}!')
            return redirect('index')
    else:
        form = UserRegisterForm()
        login_form = AuthenticationForm()


    now = datetime.datetime.now()
    cur_year = now.year

    context = {
        'login_form': login_form,
        'form'  : form,
        'year'  : cur_year
    }

    return render(request, 'home/index.html', context)


def about(request):
    return render(request, 'about.html')

Я получаю следующую ошибку при попытке отправить либо логин, либоФорма регистрации:

local variable 'login_form' referenced before assignment

может предоставить URL сайта, если это поможет.

Ответы [ 2 ]

1 голос
/ 09 июля 2019

Если пользователь отправляет неверную форму регистрации, вы никогда не определите форму входа.Затем, когда вы нажмете context =, вы получите это исключение.

Я бы предложил создать «пустой» экземпляр формы для «другой» формы.(Это сложно объяснить, пример поможет

if request.POST.get('submit') == 'login':
    form = UserRegisterForm()
    login_form = AuthenticationForm(request.POST)

    [login logic here]

elif request.POST.get('submit') == 'register':
    login_form = AuthenticationForm()
    form = UserRegisterForm(request.POST)

    [registration logic here]

0 голосов
/ 09 июля 2019

Я работал, используя комбинацию ответов @Chris Curvey и меняя кнопки с использованием значения 'login' или 'register' на имя с этими строками, а затем в моих условиях, используя 'if' login 'в request.POST:"

if 'login' in request.POST:
    form = UserRegisterForm()
    [login logic]

elif 'register' in request.POST:
    login_form = AuthenticationForm()
    [registration logic]
...