修改使用django框架创建的注册选项卡。

问题描述 投票:0回答:1

我做了一个注册标签,可以注册新的用户和登录页面,允许注册用户继续使用网站。我希望如果任何注册用户(有一个注册的电子邮件)试图再次注册,错误信息应该弹出'你已经有一个帐户,请登录'。我把注册用户的数据存储在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

视图.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="[email protected]" 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 %}
python html css django django-models
1个回答
0
投票

好吧,所以这里是完整的解决方案。我对你现有的解决方案做了一些修改,希望对你有所帮助。

Django自带的内置 User 模型,其中已经内置了认证逻辑。伟大的事情是,它也可以被扩展。所以我创建了 UserDetails 模型,它扩展了 User 使用 OneToOneField. 创建并将以下代码放入models.py中。

模型.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

处理注册逻辑。

我们已经创建了模型,现在要从用户那里获取数据,我们需要表单。Django内置了对处理 表格 逻辑。我创建了两个 样板 作为 UserFormUserDetailsForm. 这里有一个棘手的部分,两个表单都是作为一个单独的表单,每个表单都不知道其他表单。所以我创建了一个 表格集 稍后将用于链接我们的 UserUserDetails 视图内。在forms.py中创建并放入以下代码。

表单.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 它将处理 SignUp 请求。这里我通过了 UserFormUserDetailsFormSet 的上下文中,并使用模板渲染表单。如果你仔细看了 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)

处理登录逻辑。

登录功能是非常直接的。为了处理登录,我创建了 loginView. Django提供内置的 AuthenticationForm 用于处理 User 认证。要使 AuthenticationForm 开模 loginTemplate.html.

登录模板.html

<form method="POST">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">Submit</button>
</form>

login() 方法是Django内置的处理用户登录的功能。将以下代码放入views.py中(注意:不要忘记在成功登录后在 redirect() 方法)。)

视图.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')
]

也在你的项目urls文件中不要忘记添加引用到你的应用程序的url文件中,通过把 path('', include('your_app.urls')) 在urlpatterns中(注意:用你的app名代替your_app)

现在你可以通过使用 python manage.py runserver 命令。进入你的网页浏览器,浏览 localhost:port/signup 获得注册页面,并 localhost:port/login 以获得登录页面。

希望大家对 管理站 (即 创建超级用户 并登录到管理员站点),在管理员站点注册您的模型,如下所示。然后用你的超级用户证书登录,并查看 UserUserDetails 在管理站点的表格。

admin.py

from django.contrib import admin
from .models import UserDetails

admin.site.register(UserDetails)

我希望这将帮助你。)

© www.soinside.com 2019 - 2024. All rights reserved.