Django内置登录/注册/退出功能
用户类使用的是django内置的User
1,登录功能
urls.py
from django.contrib import admin from django.urls import path from django.contrib.auth import views as auth_views from blog.views import blogs, account urlpatterns = [ path('admin/', admin.site.urls), # 博客管理 path('blog', blogs.blog_title), path('blog/<int:article_id>/article', blogs.blog_article), # 账号管理 path('django_login', auth_views.LoginView.as_view(template_name='account/login.html'), name="user_login"), # django内置的登录功能 path('login', account.user_login), ]
views.py

from django.shortcuts import render from django.http import HttpResponse from django.contrib.auth import authenticate, login # django内置的用户认证和管理应用 from blog.forms.account_forms import LoginForm def user_login(request): '''用户登录''' if request.method == "GET": login_form = LoginForm() return render(request, "account/login.html", {"form": login_form}) if request.method == "POST": print("***********") login_form = LoginForm(request.POST) if login_form.is_valid(): cd = login_form.cleaned_data user = authenticate(username=cd["username"], password=cd["password"]) if user: login(request, user) return HttpResponse("Welcome You.You have been authenticated successfully!") else: return HttpResponse("Sorry. your username or password is not right!") else: return HttpResponse("Invalid login")

{% extends 'base.html' %}
{% block title %}Login{% endblock %}
{% block content %}
<div class="row text-center vertical-middle- sm">
<h1>Login</h1>
<p> Input your username and password</p>
<form class="form-horizontal" method="post" action="/login">
{% csrf_token %}
{# {{ form.as_p}} p标签格式显示 #}
<div class="form-group">
<label for="{{ form.username.id_for_label }}" class="col-md-5 control-label" style="color:red">
<span class="glyphicon glyphicon-user"></span>Username</label>
<div class="col-md-6 text-left">{{ form.username }}</div>
</div>
<div class="form-group">
<label for="{{ form.password.id_for_label }}" class="col-md-5 control-label" style="color: blue">
<span class="glyphicon glyphicon-floppy-open"></span>Password</label>
<div class="col-md-6 text-left">{{ form.password }}</div>
</div>
<input type="submit" class="btn btn-primary btn-lg" value="Login">
</form>
</div>
{% endblock %}


header.html
{% load static %}
<div class="container">
<nav class="navbar navbar-default" role="navigation">
<div class="navbar-header">
<a class="navbar-brand" href="http://www.itdiffer.com"><img src="{% static '/images/logo.png' %}"
width="100px"></a>
</div>
<div>
<ul class="nav navbar-nav" role="navigation">
<li><a href="/blog">BL0G</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
{% if user.is_authenticated %}
<li><a href="#">{{ user.username }}</a></li>
<li><a href="#">Logout</a></li>
{% else %}
<li><a href="/login">LOGIN</a></li>
{% endif %}
</ul>
</div>
</nav>
</div>
2,退出登录

# django内置的退出功能 path('django_logout', auth_views.LogoutView.as_view(), name="user_logout"),

不需要写视图函数



# django内置的退出功能 path('django_logout', auth_views.LogoutView.as_view(template_name='account/logout.html'), name="user_logout"),
3,注册


def register(request): if request.method == "POST": user_form = RegistrationForm(request.POST) userprofile_form = UserProfileForm(request.POST) if user_form.is_valid(): # 内置的user类,注册时会校验用户名,用户名不能一样 new_user = user_form.save(commit=False) # commit=False :不保存到数据库 new_user.set_password(user_form.cleaned_data['password']) # 设置密码 new_user.save() # 内置user的新增属性 new_profile = userprofile_form.save(commit=False) new_profile.user = new_user new_profile.save() return HttpResponse("successful1y") else: return HttpResponse("sorry, your can not register.") else: # get请求 user_form = RegistrationForm() userprofile_form = UserProfileForm() return render(request, "account/register.html", {"form": user_form, "profile": userprofile_form})

class RegistrationForm(forms.ModelForm): '''注册表单''' password = forms.CharField(label="Password", widget=forms.PasswordInput) password2 = forms.CharField(label="Confirm Password", widget=forms.PasswordInput) class Meta: model = User fields = ("username", "email") def clean_password2(self): cd = self.cleaned_data if cd['password'] != cd['password2']: raise forms.ValidationError("passwords do not match.") return cd['password2'] class UserProfileForm(forms.ModelForm): '''内置用户,新增属性''' class Meta: model = UserProfile fields = ("phone", "birth")

class UserProfile(models.Model): '''内置用户类,新增属性''' user = models.OneToOneField(User, unique=True, on_delete=models.CASCADE) birth = models.DateField(blank=True, null=True) phone = models.CharField(max_length=20, null=True) def __str__(self): return 'user{}'.format(self.user.username)

from django.contrib import admin from .models import BlogArticles, UserProfile # Register your models here. class BlogArticlesAdmin(admin.ModelAdmin): '''文章类''' list_display = ("title", "author", "publish") list_filter = ("publish", "author") search_fields = ('title', "body") # 搜索条件 raw_id_fields = ("author",) date_hierarchy = "publish" ordering = ['publish', 'author'] # 排序 class UserProfileAdmin(admin.ModelAdmin): '''django内置User的新增属性''' list_display = ('user', 'birth', 'phone') list_filter = ('phone',) admin.site.register(BlogArticles, BlogArticlesAdmin) # 把类BlogArticles注册到admin,显示内容为:BlogArticlesAdmin admin.site.register(UserProfile, UserProfileAdmin) # 把类UserProfile注册到admin,显示内容为:UserProfileAdmin

{% extends "base.html" %}
{% load static %} :
{% block title %}register user{% endblock %}
{% block content %}
<div class="row text-center">
<h1>Register</h1>
<p>If you are a user,<strong><a href="/login">Login</a></strong> , please</p>
<p>or register.</p>
<form class="form-horizontal" method="post">
{% csrf_token %}
<div class=" form-group">
<label for="{{ form.username.id_for.label }}" class="col-md-5 control-label">Username</label>
<div class="col-md-6 text-left">{{ form.username }}</div>
</div>
<div class="form-group">
<label for="{{ form.email.id_for.label }}" class="col-md-5 control-label">Email</label>
<div class="col-md-6 text-left">{{ form.email }}</div>
</div>
<div class="form-group">
<label for="{{ form.password.id_for_1abel }}" class="col-md-5 control-label">Password</label>
<div class="col-md-6 text-left">{{ form.password }}</div>
</div>
<div class="form-group">
<label for="{{ form.password.id_for_label }}" class="col-md-5 control-label">Confirm Pas sword</label>
<div class="col-md-6 text-left">{{ form.password2 }}</div>
</div>
<div class="form-group">
<label for="{{ profile.birth.id_for_label }}" class="col-md-5 control-label">Birth Date</label>
<div class="col-md-6 text-left">{{ profile.birth }}</div>
</div>
<div class="form-group">
<label for="{{ profile.phone.id_for_label }}" class="col-md-5 control-label">Phone</label>
<div class="col-md-6 text-left">{{ profile.phone }}</div>
</div>
<input type="submit" class="btn btn-primary btn-lg" value="REGISTER">
</form>
</div>
{% endblock %}


浙公网安备 33010602011771号