Как сделать вход и регистрацию на одном html шаблоне в Django?

В Django вы можете легко создать вход и регистрацию на одном HTML-шаблоне, используя формы и представления.

1. Создайте формы для входа и регистрации пользователя:

from django import forms

class LoginForm(forms.Form):
    username = forms.CharField(label='Username')
    password = forms.CharField(label='Password', widget=forms.PasswordInput)

class RegistrationForm(forms.Form):
    username = forms.CharField(label='Username')
    password = forms.CharField(label='Password', widget=forms.PasswordInput)
    confirm_password = forms.CharField(label='Confirm Password', widget=forms.PasswordInput)

2. В представлении, обработайте GET- и POST-запросы для входа и регистрации:

from django.shortcuts import render, redirect
from django.contrib.auth import authenticate, login, logout

def login_registration(request):
    if request.method == 'POST':
        login_form = LoginForm(request.POST)
        registration_form = RegistrationForm(request.POST)
        if login_form.is_valid():
            username = login_form.cleaned_data['username']
            password = login_form.cleaned_data['password']
            user = authenticate(username=username, password=password)
            if user:
                login(request, user)
                return redirect('home')
        if registration_form.is_valid():
            username = registration_form.cleaned_data['username']
            password = registration_form.cleaned_data['password']
            confirm_password = registration_form.cleaned_data['confirm_password']
            if password == confirm_password:
                user = User.objects.create_user(username=username, password=password)
                user.save()
                login(request, user)
                return redirect('home')
    else:
        login_form = LoginForm()
        registration_form = RegistrationForm()
    return render(request, 'login_registration.html', {'login_form': login_form, 'registration_form': registration_form})

3. Создайте HTML-шаблон 'login_registration.html' для отображения форм входа и регистрации:

{% if form_errors %}
  <ul>
    {% for error in form_errors %}
      <li>{{ error }}</li>
    {% endfor %}
  </ul>
{% endif %}

<form method="POST" action="{% url 'login_registration' %}">
  {% csrf_token %}
  
  <h3>Login</h3>
  {{ login_form.as_p }}

  <button type="submit">Login</button>
</form>

<hr>

<form method="POST" action="{% url 'login_registration' %}">
  {% csrf_token %}

  <h3>Registration</h3>
  {{ registration_form.as_p }}

  <button type="submit">Register</button>
</form>

4. Добавьте URL-шаблон в файле urls.py:

from django.urls import path
from .views import login_registration

urlpatterns = [
    path('login_registration/', login_registration, name='login_registration'),
]

Теперь вы можете открыть страницу по адресу /login_registration/ и увидеть формы входа и регистрации на одной странице. После успешной аутентификации или регистрации пользователь будет перенаправлен на страницу home (обратите внимание, что вы должны заменить 'home' на адрес нужной вам страницы). Если данные формы не проходят валидацию, ошибки будут выведены на страницу.