Вкладка «Изменение», созданная с использованием django framework - PullRequest
0 голосов
/ 24 апреля 2020

Я сделал вкладку регистрации, которая регистрирует новых пользователей и страницу входа, которая позволяет зарегистрированным пользователям продолжать работу с сайтом. Я хочу, чтобы любой зарегистрированный пользователь (имеющий зарегистрированный адрес электронной почты) попытался снова зарегистрироваться, должно появиться сообщение об ошибке «У вас уже есть учетная запись. Пожалуйста, войдите'. Я сохранил данные о зарегистрированных пользователях в таблице, созданной в models.py с именем SignedUpUsers. Пожалуйста, помогите мне выполнить мою задачу.

models.py


# Create your models here.


class SignedUpUsers(models.Model):
    email = models.EmailField(max_length=122)
    name = models.CharField(max_length=122)
    username = models.CharField(max_length=122)
    password = models.CharField(max_length=122)
    date = models.DateField()

    def __str__(self):
        return self.name

views.py

from Home.models import SignedUpUsers
from django.contrib import messages
from datetime import datetime

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


def signup(request):
    if request.method == 'POST':
        name = request.POST.get('name')
        email = request.POST.get('email')
        username = request.POST.get('username')
        password = request.POST.get('password')
        cont = SignedUpUsers(name=name,email=email,username=username,password=password,date=datetime.today())
        cont.save()
        messages.success(request,"\t\tYour account has successfully been created . Kindly Log In\t\t")
    return render(request, 'signup.html')

регистрация. html

<!--Form-->
<form method="post" action="/signup" style="
    position: absolute;
    top: 260px;
    left: 500px;
    font-size: larger;
">
    {%csrf_token%}
    <!--Email-->
  <div class="form-group" >
    <label for="email">Email address</label>
    <input type="email" size="25" class="form-control" id="email" name="email" placeholder="name@example.com" style="block-size: 25px; position: absolute; left: 120px;">
  </div>
    <!--Name-->
    <div class="form-group" >
    <label for="name" style="position: absolute;left: 0px;top: 30px;">Name</label>
    <input type="text" size="25" class="form-control" id="name" name="name" placeholder="Arbaaz Ahmed" style="block-size: 25px;position: absolute;left: 120px;top: 30px;">
  </div>
    <!--Username-->
    <div class="form-group" >
    <label for="username" style="position: absolute;left: 0px;top: 60px;">Username</label>
    <input type="text" size="25" class="form-control" id="username" name="username" placeholder="arbaazahmed2134" style="block-size: 25px;position: absolute;left: 120px;top: 60px;">
  </div>
    <!--Password-->
    <div class="form-group" >
    <label for="password" style="position: absolute;left: 0px;top: 90px;">Password</label>
    <input type="password" class="form-control" size="25" id="password" name="password" style="block-size: 25px;position: absolute;left: 120px;top: 90px;">
  </div>
    <!--Sign up Button-->
    <button type="submit" class="btn btn-primary" style="
    position: absolute;
    top: 130px;
    left: 120px;
    background-color: antiquewhite;
    height: 27px;
    width: 100px
">Sign Up</button>
</form>

<!--Account Created-->
{% if messages %}
{% for message in messages%}
<div class="alert alert-{{message.tags}}" role="alert" style="position: absolute; background-color: aqua; left: 470px; top: 430px">
  <!--<h4 class="alert-heading">Well done!</h4>-->
    {{ message }}
</div>
{% endfor %}
{% endif %}

1 Ответ

0 голосов
/ 24 апреля 2020

Хорошо, вот полное решение. Я сделал некоторые изменения в вашем существующем решении, надеюсь, это поможет вам.

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)

Надеюсь, это поможет вы. :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...