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 %}

 

 

posted @ 2024-07-27 15:26  shuqi123  阅读(24)  评论(0)    收藏  举报