我做了一个注册标签,可以注册新的用户和登录页面,允许注册用户继续使用网站。我希望如果任何注册用户(有一个注册的电子邮件)试图再次注册,错误信息应该弹出'你已经有一个帐户,请登录'。我把注册用户的数据存储在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 %}
好吧,所以这里是完整的解决方案。我对你现有的解决方案做了一些修改,希望对你有所帮助。
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内置了对处理 表格 逻辑。我创建了两个 样板 作为 UserForm
和 UserDetailsForm
. 这里有一个棘手的部分,两个表单都是作为一个单独的表单,每个表单都不知道其他表单。所以我创建了一个 表格集 稍后将用于链接我们的 User
与 UserDetails
视图内。在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 请求。这里我通过了 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)
处理登录逻辑。
登录功能是非常直接的。为了处理登录,我创建了 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
以获得登录页面。
希望大家对 管理站 (即 创建超级用户 并登录到管理员站点),在管理员站点注册您的模型,如下所示。然后用你的超级用户证书登录,并查看 User
和 UserDetails
在管理站点的表格。
admin.py
from django.contrib import admin
from .models import UserDetails
admin.site.register(UserDetails)
我希望这将帮助你。)