Хорошо, вот полное решение. Я сделал некоторые изменения в вашем существующем решении, надеюсь, это поможет вам.
Django поставляется со встроенной User
моделью, в которой уже есть встроенные логины аутентификации c. Отличная вещь, она также может быть расширена. Итак, я создал UserDetails
модель, которая расширяет User
, используя OneToOneField
. Создайте и поместите следующий код в models.py.
models.py
from django.db import models
from django.contrib.auth.models import User
class UserDetails(models.Model):
user = models.OneToOneField(User,on_delete=models.CASCADE)
name = models.CharField(max_length=122)
dob = models.DateField()
def __str__(self):
return self.name
После его создания создайте миграции с помощью следующей команды python manage.py makemigrations
и после этого python manage.py migrate
Обработка регистрации logi c:
Мы уже создали наши модели, теперь для получения данных от пользователя Нам нужны формы. Django имеет встроенную поддержку для обработки форм logi c. Я создал две модели формы как UserForm
и UserDetailsForm
. Здесь возникает сложная часть, обе формы действуют как отдельные формы, и каждая форма не знает о других. Поэтому я создал formset , который будет использоваться позже, чтобы связать наш User
с UserDetails
внутренним видом. Создайте и поместите следующий код в forms.py.
forms.py
from django import forms
from .models import UserDetails
from django.contrib.auth.models import User
from django.contrib.auth.forms import UserCreationForm
class UserForm(UserCreationForm):
class Meta:
model = User
fields = ('email','username','password1', 'password2',)
class UserDetailsForm(forms.ModelForm):
class Meta:
model = UserDetails
fields = ('name', 'dob',)
from django.forms import inlineformset_factory
# Formset is combining UserForm and UserDetailsForm
UserDetailsFormSet = inlineformset_factory(User, UserDetails, form=UserDetailsForm,
extra=1, can_delete = False)
Чтобы отобразить обе формы, создайте шаблон signUpTemplate.html
. (Примечание. Вы можете ввести его позже)
signUpTemplate. html
<form method="POST">
{% csrf_token %}
{{ user_form.as_p }}
{{ user_details_form.as_p }}
<button type="submit">Submit</button>
</form>
Теперь я создал представление как signUpView
, которое будет обрабатывать запросы на регистрацию. Здесь я передал UserForm
и UserDetailsFormSet
в контексте и отрисовал форму, используя шаблон. Если вы внимательно посмотрели в signUpTemplate
, я использую один тег формы <form>***code***</form>
для визуализации обеих форм, так как это заставит отправлять обе формы в одном запросе.
Теперь вот как я обрабатываю формирует данные в поле зрения. Сначала я проверяю на UserForm
. Если UserForm верна, то я обрабатываю UserDetailsFormSet
и передаю в нем экземпляр UserForm
(возможно, вы видели параметр commit=false
в методе сохранения. Этот параметр означает, что просто сохраните его в памяти, а не в реальной базе данных). Если UserDetailsFormSet
действительно, то я вызываю метод save () в обеих формах. Если формы недействительны, то они автоматически отобразят ошибку в шаблоне * (это сила встроенных форм) *. Вот код представления в views.py.
views.py
from django.shortcuts import render,redirect
from django.conf import settings
from .forms import UserForm, UserDetailsFormSet
def signUpView(request):
user_form = UserForm(request.POST or None)
user_details_form = UserDetailsFormSet(request.POST or None)
if request.method == 'POST':
user_form = UserForm(request.POST)
if user_form.is_valid():
user = user_form.save(commit=False)
user_details_form = UserDetailsFormSet(request.POST,instance=user)
if user_details_form.is_valid():
user.save()
user_details_form.save()
return redirect('login')
context = {
'user_form': user_form,
'user_details_form': user_details_form,
}
return render(request, 'signUpTemplate.html',context=context)
Обработка логинов входа в систему c:
Функциональность входа в систему довольно проста. Для обработки логина я создал loginView
. Django предоставляет встроенный AuthenticationForm
для обработки User
аутентификации. Для рендеринга AuthenticationForm
создайте шаблон loginTemplate.html
.
loginTemplate. html
<form method="POST">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Submit</button>
</form>
Метод login()
- это встроенная функциональность Django для обработки входа пользователя. Поместите следующий код в views.py (Примечание: не забудьте добавить URL-адрес после успешного входа в метод redirect()
).
views.py
from django.contrib.auth import login
from django.contrib.auth.forms import AuthenticationForm
from django.conf import settings
def loginView(request):
form = AuthenticationForm(request.POST or None)
if request.method == 'POST':
form = AuthenticationForm(data=request.POST)
if form.is_valid():
user = form.get_user()
login(request, user)
return redirect('URL_after_successful_login')
return render(request, 'loginTemplate.html', context = {'form': form})
Как мы сделали всю основную часть, теперь мы можем зарегистрировать оба представления в нашем файле urls.py приложений.
urls.py
from .views import index,loginView,signUpView
from django.urls import path
urlpatterns = [
path('', index, name='index'),
path('login', loginView, name = 'login' ),
path('signup', signUpView, name = 'signup')
]
также в вашем Файл проектов URL-адресов не забудьте добавить ссылку на файл URL-адресов ваших приложений, указав path('', include('your_app.urls'))
в urlpatterns (Примечание: замените your_app на имя вашего приложения)
Теперь вы можете запустить сервер с помощью команды python manage.py runserver
. Go в вашем веб-браузере и найдите localhost:port/signup
, чтобы получить страницу регистрации, и localhost:port/login
, чтобы получить страницу входа.
Я надеюсь, что вы знакомы с admin site (то есть создание суперпользователя и авторизация на сайте администратора), зарегистрируйте свою модель на сайте администратора следующим образом. И войдите под своими учетными данными суперпользователя и проверьте User
и UserDetails
таблицы на сайте администратора.
admin.py
from django.contrib import admin
from .models import UserDetails
admin.site.register(UserDetails)
Надеюсь, это поможет вы. :)