Django学习---多人博客项目(2)

Django学习---多人博客项目(2)

? 上一部分内容完成了博客项目的搭建,以及博客标题和博客内容的展示,熟悉了Django的使用,下面,接着实现用户管理部分功能。

一、自定义模板和静态文件的位置

(1)自定义模板的位置

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) # 当前文件路径的上两级文件路径--即是根目录

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')] #即模板目录的位置是相对项目根目录的templates目录——./templates
        ,
        'APP_DIRS': False,# True, # False表示不允许Django按照默认方式寻找模板文件
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

(2)自定义静态文件的位置

# settings 文件的最后三行
# Django 支持这三种静态文件
# Static files (CSS, JavaScript, Images) 

# 想知道Django是如何实现的可以查看上面这个网址
# https://docs.djangoproject.com/en/3.0/howto/static-files/ 

#在默认状态下,如果通过URL访问静态文件,各个应用的静态文件都有自己的静态文件存放地
#例如可以通过http://localhost:8000/blog/static/newton.jpg的模式进行访问,blog应用的静态文件newton.jpg
STATIC_URL = '/static/'

#注,本项目不打算这样设置,而是把静态文件放到指定的目录,在上一行下面添加如下代码:
STATICFILES_DIRS =(
    os.path.join(BASE_DIR, "static"),
)
# 在根目录下创建static目录,添加newton.jpg文件,在浏览器进行测试

(3)通用静态文件和基础模板

? 1、首先下载jquery和bootstrap等相关的文件并放到创建的static目录下:

bootstrap下载链接:https://www.bootcss.com/

? 2、创建新的通用的基础模板

头部代码:header.html
{% load staticfiles %}
<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.jpg' %}" width="100px">
            </a>
        </div>
        <div>
            <ul class="nav navbar-nav" role="navigation">
                <li><a href="{% url 'blog:blog_title' %}"></a></li>
            </ul>
            <ul class="nav navbar-nav navbar-right">
                <li><a href="#">LOGIN</a></li>
            </ul>
        </div>
    </nav>
</div>
脚部代码:footer.html

<div class="container">
    <hr>
    <p class=""text-center>
        copy right www.itdiffer.com
    </p>
</div>
base.html

{% load staticfiles %}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta http-equiv="X-UA-Compatible" content="IE=Edge">
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>{% block title %}

    {% endblock %}</title>
    <link rel="stylesheet" href="{% static 'css/bootstrap.css' %}">
</head>
<body>
{% include "header.html" %}
    <div class="container">
        {% block content %}
        {% endblock %}
    </div>
{% include "footer.html" %}
{% block javascript %}{% endblock %}
</body>
</html>

(4)配置路由

方式一:
    在./mysite/urls.py的urlpatterns中进行如下设置。特别注意,include()中的第一参数提供的是一个二元的元组。
    urlpatterns=[
    path('admin/',admin.site.urls),
    # path('blog/', include('blog.urls'))
    path('blog/', include(('blog.urls', 'blog'), namespace='blog'))
]
    在./blog/urls.py的urlpatterns中进行如下配置。
    urlpatterns = [
    # path('', views.blog_title),    # 此处将函数视图添加进来
    # path('<int:article_id>', views.blog_article)
    path('', views.blog_title, name='blog_title'),   # 此处将函数视图添加进来
    path('<int:article_id>/', views.blog_article, name='blog_article')
]
方式二:
    在./mysite/urls.py的urlpatterns中进行如下设置。注意,被注释了的那一行是“方式一”的配置,请读者注意比较两种配置方式之不同。
    urlpatterns=[
    path('admin/',admin.site.urls),
    # path('blog/', include('blog.urls')),
    # path('blog/', include(('blog.urls', 'blog'), namespace='blog')),
    path('blog/', include('blog.urls', namespace='blog')),
]
    在./blog/urls.py的urlpatterns中进行如下配置,比“方式一”增加了app_name = "blog"这一行。
    app_name = "blog"   # 新增加这一行
    urlpatterns = [
    # path('', views.blog_title),    # 此处将函数视图添加进来
    # path('<int:article_id>', views.blog_article)
    path('', views.blog_title, name='blog_title'),   # 此处将函数视图添加进来
    path('<int:article_id>/', views.blog_article, name='blog_article')
]
    以上两种方式,供读者自行选择。

二、用户登录

(1)创建应用

1、创建新应用(account)

python manage.py startapp account

# 修改配置: ./mysite/settings.py 中:
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'blog',
    'account',
]

2、URL配置

# ./mysite/urls.py
urlpatterns=[
    path('admin/', admin.site.urls),
    # path('blog/', include('blog.urls')),
    path('blog/', include(('blog.urls', 'blog'), namespace='blog')),
    # path('blog/', include('blog.urls', namespace='blog')), #该方法配置和上面一样的效果
    # 新添加的路由
    path('account/', include(('account.urls', 'account'), namespace='account')),
]

# 在新应用account目录下,创建urls.py, 进行配置。
from django.urls import path
from . import views

urlpatterns = [
    path('login/', views.user_login, name='user_login'),
]

(2)创建表单类

在 ./account目录中新建文件forms.py ,在forms.py中创建表单类用于用户登录:
from django import forms

class LoginForm(forms.Form):
    username = forms.CharField()
    password = forms.CharField(widget=forms.PasswordInput)

(3)创建登录的视图函数

在 ./account/views.py文件中创建视图函数user_login()

from django.shortcuts import render
from django.http import HttpResponse
from django.contrib.auth import authenticate, login
from .forms import LoginForm
# Create your views here.

def user_login(request):
    if request.method == "POST":
        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("Your username or password is not right.")
        else:
            return HttpResponse("Invalid login")
    if request.method == "GET":
        login_form = LoginForm()
        return render(request, "account/login.html", {"form": login_form})

(4)创建登录的前端界面

? 在./templates/account/login.py 里添加如下代码:

{% 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" action="." method="post">
        {% csrf_token %}
        {{ form.as_p }}
        <input type="submit" value="Login">
    </form>
</div>
{% endblock %}

三、用内置方法实现登录和退出

(1)内置方法实现登录

? 1、在./account/urls.py 中配置路由如下:

from django.urls import path
from . import views
from django.contrib.auth import views as auth_views  # 用户内置登录引入

urlpatterns = [
    # path('login/', views.user_login, name='user_login'),
    path('login/', auth_views.LoginView.as_view(template_name='account/login2.html'), name='user_login'),
]

? 2、添加路由配置里的网页login2.html

{% extends "base.html" %}
{% load staticfiles %}
{% block title %}Login{% endblock %}
{% block content %}
<div class="row text-center vertical-middle-sm">
    <h1>Login--Built in method of Django</h1>
    {% if form.errors %}
        <p>Your username and password didn't match.Please try agin.</p>
    {%endif %}
        <p>Input your username and password</p>
    <form calss="form-horizontal" action="{% url 'account:user_login' %}" method="post">
        {% csrf_token %}
        <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-user">
                </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 %}

? 3、修改配置文件

为了设置项目所需要的转向目标,需要在./mysite/settings.py中增加LOGIN_REDIRECT_URL的值(将以下配置放置到./mysite/settings.py文件的最后)。
    LOGIN_REDIRECT_URL = '/blog/'

(2)判断是否登录

{% load staticfiles %}
<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="{% url 'home' %}">HOME</a></li>
                <li><a href="{% url 'blog:blog_title' %}">BLOG</a></li>
                <li><a href="{% url 'article:article_titles' %}">文章</a></li>
                <li><a href="{% url 'image:falls_images' %}">美图</a></li>
                <li><a href="{% url 'course:course_list' %}">课程</a></li>
                <li><a href="{% url 'course:about'%}">关于本站</a></li>
            </ul>
            <ul class="nav navbar-nav navbar-right" style="margin-right:10px">
                {% if user.is_authenticated %}
                <li>
                    <div class="dropdown" style="margin-top:8px">
                        <button class='btn btn-default dropdown-toggle' type='button' id='dropdownMenu' data-toggle='dropdown'>{{ user.username }}
                            <span class='caret'></span>
                        </button>
                        <ul class="dropdown-menu">
                            <li><a href="{% url 'account:password_change' %}">修改密码</a></li>
                            <li><a href="{% url 'account:my_information' %}">个人信息</a></li>
                            <li><a href="{% url 'article:article_column' %}">后台管理</a></li>
                        </ul>
                    </div>
                </li>
                <li><a href="{% url 'account:user_logout' %}">Logout</a></li>
                {% else %}
                <li><a href="{% url 'account:user_login' %}">LOGIN</a></li>
                <li><a href="{% url 'account:user_register' %}">Sign up</a></li>
                {% endif %}
            </ul>
        </div>
    </nav>
</div>

<script src="{% static 'js/jquery.js' %}"></script>
<script src="{% static 'js/bootstrap.js' %}"></script>
<!--
 现在就来修改./templates/header.html模板,使LOGIN所在的位置根据用户登录状态显示不同的内容。如果用户已经登录,则显示用户名和Logout字样;如果用户尚未登录,则显示LOGIN字样,并做超链接到登录界面。
--/>
{% load staticfiles %}
<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.jpg' %}" width="100px">
            </a>
        </div>
        <div>
            <ul class="nav navbar-nav" role="navigation">
                <li><a href="{% url 'blog:blog_title' %}">BLOG</a></li>
            </ul>
            <ul class="nav navbar-nav navbar-right" style="margin-right: 10px">
                {% if user.is_authenticated %}
                    <li><a href="#">{{ user.username }}</a></li>
                    <li><a href="#">Logout</a></li>
                {% else %}
                    <li><a href="{% url 'account:user_login' %}">LOGIN</a></li>
                {% endif %}
            </ul>
        </div>
    </nav>
</div>

(3)内置退出

? 与登录类似,首先配置URL。编辑./account/urls.py文件,增加如下内容。

urlpatterns = [
    # path('login/', views.user_login, name='user_login'),
    path('login/', auth_views.LoginView.as_view(template_name='account/login2.html'), name='user_login'),
    path('logout/', auth_views.LoginView.as_view(template_name='account/logout.html'), name='user_logout'),
]

? 此处配置好后,把./templates/header.html文件中那个针对Logout的超链接修改一下。

<li><a href="{% url 'account:user_logout' %}">Logout</a></li>

? 在./templates/account/中创建一个退出的模板文件,名为logout.html,代码如下。

{% extends "base.html" %}
{% block title %}Login{% endblock %}
{% block content %}
<div class="row text-center vertical-middle-sm">
    <p>You have log out</p>
    <p>You can <a href="{% url 'account:user_login' %}" >Login</a> again .</p>
</div>
{% endblock %}

四、用户注册

(1)简单注册

? 1、编写表单类 ./account/form.py文件,增加一个注册用户表单类:

from django import forms
from django.contrib.auth.models import User

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']

? 2、在./account/views.py中 ,添加视图函数:

from .forms import RegistrationForm

def register(request):
    if request.method == "POST":
        user_form = RegistrationForm(request.POST)
        if user_form.is_valid():
            new_user = user_form.save(commit=False)
            new_user.set_password(user_form.cleaned_data['password'])
            new_user.save()
            return HttpResponse("successfully .")
        else:
            return HttpResponse("sorry, your can not register .")
    else:
        user_from = RegistrationForm()
        return render(request, "account/register.html", {"form":user_from})

3、在./templates/account/ 下创建前端页面 register.html:

{% extends base.html %}
{% load staticfiles %}
{% block title %} register user{% endblock %}
{% block content %}
    <div class="row text-center vertical-middle-sm">
        <h1>Register</h1>
        <p>If you are a user,<strong><a href="{% url 'account:user_login' %}">Login</a></strong>,please</p>
        <p>or register.</p>
        <from class="form-horizontal" action="." 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.eamil.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_label }}" 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.password2.id_for_label }}" class="col-md-5 control-label">
                    Confirm Password
                </label>
                <div class="col-md-6 text-left">{{ form.password2 }}</div>
                 <input type="submit" class="btn btn-primary btn-lg" value="REGISTER">
            </div>
        </from>
    </div>
{% endblock %}

4、配置路由, ./account/urls.py 中配置:

urlpatterns = [
    path('register/',views.register, name ='user_register') # 新增
]

? 5、进行测试

http://127..0.0.1:8080/account/register.html

(2)增加注册内容

1、要增加一个User数据模型中没有的字段(比如手机号),编辑./account中的models.py文件,并在其中输入如下代码。

from django.db import models
from django.contrib.auth.models import User
# Create your models here.

class UserProfile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, unique=True)
    birth = models.DateField(blank=True, null=True)
    phone = models.CharField(max_length=20, null=True)

    def __str__(self):
        return 'user {}'.format(self.user.username)

  # 数据迁移
    python manage.py makemigrations account
    python manage.py migrate account

2、按照流程,下面应该编写表单类了,编辑./account/forms.py文件,代码如下:

from .models import UserProfile

class UserProfileForm(forms.ModelForm):
    class Meta:
        model = UserProfile
        fields = ("phone", "birth")

3、下面要完善视图函数。编辑./account/views.py文件,增加和修改如下代码。修改后的视图函数与原来相比,主要是兼顾了另外一个表单类,所以只是在代码行数上增加了,并没有增加新的内容。

def register(request):
    if request.method == "POST":
        user_form = RegistrationForm(request.POST)
        userprofile_form = UserProfileForm(request.POST)
        if user_form.is_valid()*userprofile_form.is_valid():
            new_user = user_form.save(commit=False)
            new_user.set_password(user_form.cleaned_data['password'])
            new_user.save()
            new_profile = userprofile_form.save(commit=False)
            new_profile.user = new_user
            new_profile.save()
            return HttpResponse("successfully")
        else:
            return HttpResponse("sorry, your can not register.")
    else:
        user_form = RegistrationForm()
        userprofile_form = UserProfileForm()
        return render(request, "account/register.html", {"form": user_form, "profile":userprofile_form})

? 4、修改模板,重新编辑./templates/account/register.html文件,代码如下:

{% extends "base.html" %}

{% load staticfiles %}

{% block title %}register user{% endblock %}

{% block content %}
<div class="row text-center vertical-middle-sm">
    <h1>Register</h1>
    <p>If you are a user, <strong><a href="{% url 'account:user_login' %}">Login</a> </strong>,please</p>
    <p>or register.</p>
    <form class="form-horizontal" action="." 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_label }}" 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 Password</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 %}

(3)管理增加注册内容

? 1、在我们增加用户注册信息后,所增加的内容能不能也在超级管理员界面中进行集中管理,要实现这个功能,需要对./account/admin.py文件进行编辑,代码如下:

class UserProfileAdmin(admin.ModelAdmin):
    list_display = ('user', 'birth', 'phone')
    list_filter = ("phone",)

admin.site.register(UserProfile, UserProfileAdmin)

#· list_display属性的作用是列出列表中的项目。注意这个属性的名称不能改变,后面所有类似的属性也是如此。
#· list_filter的作用是规定网页右边FILTER的显示内容,读者可以根据这里的电话号码过滤显示列表的内容。

四、关于密码的操作

(1)修改密码

在进行具体操作之前,先梳理清楚修改密码的步骤:
    第一步,要判断用户是否登录,只有登录用户才能修改密码。
    第二步,要打开设置新密码的界面,在该界面中提交新密码。
    第三步,要给用户反馈,是否修改完成。

? 1、先写上述第二步中用于提交新密码的界面,即在./templates/account/中创建password_change_form.html文件。以下是./templates/account/password_change_form.html的代码:

{% extends "base.html" %}
{% block title %}passowrd change{% endblock %}
{% block content %}
<div class="row text-center vertical-middle-sm">
    <h1>Change Password</h1>
    <p>Please enter your old password,for security's sake, and then enter your new password twice so we can verify you typed it in correctly.</p>
    {% if form.new_password1.help_text %}
        <div class="text-left" style="margin-left:400px">
            <p>{{ form.new_password1.help_text|safe }}</p>
        </div>
    {% endif %}

    <form class="form-horizontal" action="." method="post">{% csrf_token %}
        <div class="form-group">
            <label class='col-md-5 control-label text-right'>
                {{ form.old_password.label_tag }}
            </label>
            <div class="col-md-6 text-left">{{ form.old_password }}</div>
        </div>

        <div class="form-group">
            <label class='col-md-5 control-label text-right'>
                {{ form.new_password1.label_tag }}
            </label>
            <div class="col-md-6 text-left">{{ form.new_password1 }}</div>
        </div>

        <div class="form-group">
            <label class="col-md-5 control-label text-right">
                {{ form.new_password2.label_tag }}
            </label>
            <div class="col-md-6 text-left">{{ form.new_password2 }}</div>
        </div>

        <input type="submit" value="Change my password" class="btn btn-primary btn-lg"/>
    </form>
</div>
{% endblock %}

? 2、同样,也写好第三步中密码修改完成的页面,即./templates/account/password_change_done.html,代码如下:

app_name = "account"
urlpatterns = [

    path('login/', auth_views.LoginView.as_view(template_name='account/login2.html'), name='user_login'),
    path('logout/', auth_views.LogoutView.as_view(template_name='account/logout.html'), name='user_logout'),
    path('register/', views.register, name='user_register'),
    path('password-change/', auth_views.PasswordChangeView.as_view(template_name="account/password_change_form.html", success_url="/account/password-change-done/"), name='password_change'),
    path('password-change-done/', auth_views.PasswordChangeDoneView.as_view(template_name="account/password_change_done.html"), name='password_change_done'),
]

3、如何让Django能够跳转到/account/login/请编辑./mysite/settings.py文件,在文件中增加如下内容:

LOGIN_URL = '/account/login/'

? 4、为了实现再次跳转,还需要编辑./templates/account/login2.html文件,该文件新增代码如下:

{% extends "base.html" %}
{% load staticfiles %}
{% block title %}Login{% endblock %}
{% block content %}
<div class="row text-center vertical-middle-sm">
    <h1>Login</h1>
    {% if form.errors %}
        <p>Your username and password didn't match. Please try again.</p>
    {% else %}
        <p>Input your username and password</p>
    {% endif %}
    # 新增
    {% if next %}
        <form class="form-horizontal" action="{% url 'account:user_login' %}?next={{next}}" method="post" >
    {% else %}
        <form class="form-horizontal" action="{% url 'account:user_login' %}" method="post">
    {% endif %}
    #
        {% csrf_token %}
        <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 %}

按照上面的方式修改了登录模板文件之后,再次测试,就能够实现登录之后跳转到修改密码页面的功能了。

修改的仅仅是一个模板文件./templates/header.html,修改之后其代码如下:

{% if user.is_authenticated %}
                    <li>
                        <div class="dropdown" style="margin-top:8px">
                            <button class='btn btn-default dropdown-toggle' type='button' id='dropdownMenu' data-toggle='dropdown'>
                                {{ user.username }}<span class='caret'></span>
                            </button>
                            <ul class="dropdown-menu">
                                <li><a href="{% url 'account:password_change' %}">修改密码</a></li>
{#                                <li><a href="{% url 'account:my_information' %}">个人信息</a></li>#}
{#                                <li><a href="{% url 'article:article_column' %}">后台管理</a></li>#}
                            </ul>
                        </div>
                    </li>
                    <li><a href="{% url 'account:user_logout' %}">Logout</a></li>
                {% else %}
                    <li><a href="{% url 'account:user_login' %}">LOGIN</a></li>
                    <li><a href="{% url 'account:user_register' %}">Sign up</a></li>
                {% endif %}

? 上述代码中部分不要丢失,因为我们在修改密码的功能上使用了bootstrap提供的下拉菜单功能,需要JavaScript脚本支持。修改好密码后,检查Django服务是否启动,并且保证用户处于退出状态。

(2)重置密码

? 重置密码的流程,下面就按照这个流程完成此功能的开发

1 2 3 4 5 6 7
开始 请求重置密码 输入邮箱 发送邮件提示信息 阅读邮件点击超链接 重置密码 结速

? 1、对用户请求重置密码的响应,使用Django内置的PasswordResetView类视图完成,即在./account/urls.py中配置如下URL映射。

path('password-reset/', auth_views.PasswordResetView.as_view(template_name="account/password_reset_form.html", email_template_name="account/password_reset_email.html", success_url='/account/password-reset-done/'), name='password_reset'),

2、在./templates/account/中新建password_reset_form.html文件,其代码如下:

{% extends "base.html" %}
{% block title %}password reset{% endblock %}

{% block content %}
    <div class="row text-center vertical-middle-sm">
        <h1>Forgotten your password? Reset, please.</h1>
        <p>Enter your email to set a new password.</p>
        <form class="form-horizontal" action="." method="post">
            {% csrf_token %}
            <div class="form-group">
                <label class="col-md-5 control-label text-right">Email</label>
                <div class="col-md-6 text-left">{{ form.email }}</div>
            </div>
            <input type="submit" value="Send email" class="btn btn-primary btn-lg"> </form>
    </div>
{% endblock %}

? 3、置向申请重置密码的用户邮箱所发送的邮件内容,创建新的文件 password_reset_email.html,代码如下:

<p>
    You're receiving this email because you requested a password reset for your user account at
    <a href="http://www.blog.com">blog.com</a>
</p>
<p>Please go to the following page and choose a new password:</p>
    {{ protocol }}://{{ domain }}{% url 'account:password_reset_confirm' uidb64=uid token=token %}
<p>Your username, in case you've forgotten:{{ user.get_username }}</p>
<p>Thanks for using our site!</p>
<p>The blog.com team</p>

? 4、在此处又出现了password_reset_done.html,还需要在./templates/account/中创建该文件,并录入以下代码。

{% extends "base.html" %}
{% block title %}password reset{% endblock %} 

{% block content %}
<div class="row text-center vertical-middle-sm">
    <h1>Reset your password</h1>
    <p>We've emailed you instructions for setting your password, if an account exists with the email you entered. You should receive them shortly.</p>
    <p>If you don't receive an email, please make sure you've entered the address you registered with, and check your spam folder.</p>
</div>
{% endblock %}

原文地址:https://www.cnblogs.com/sinlearn/p/12346695.html

时间: 2024-09-30 04:47:15

Django学习---多人博客项目(2)的相关文章

多人博客项目(数据库设计+Django配置)

1.分析: 多人使用的博客系统,采用BS 架构实现,为了提供显示页面,所以用浏览器,内部通讯的话,就不需要,CS就可以 博客系统,需要用户福安里,博文管理 用户管理:注册,增删查改用户 博文管理:增删改查博文 需要数据库:本次使用MySQL5.5, InnoDB 引擎 需要支持多用户登录,各自可以管理自己的博文(增删改查),管理是不公开的,但是博文是不需要登录就可以公开流浪的 先实现最小的核心需求代码 2.数据库设计 ①.创建数据库:blog ②.创建用户表,文章表 创建用户表user: 创建文

Django学习之个人博客的实现—(2)

今日任务: 1 blog的数据库模型定义 2 简单的注册登录功能的实现 项目的源文件已经推送到[email protected] 所以,如果想要参阅源码的请移步 (Fork) http://git.oschina.net/gitlab/Missuor/ Tag: v1.0.0.02 http://git.oschina.net/gitlab/Missuor/tree/v1.0.0.02 首先把昨天的历史遗留问题解决掉. Hello World SHA-1: http://git.oschina.

多人博客项目构建过程(四)

前端开发 开发环境设置 修改项目信息 打开VS工具,选择package.json文件 选择webpack.config.dev.js文件 安装依赖 $npm install $npm install react-router $npm install react-router-dom 开发 前端路由 官网文档:https://reacttraining.com/react-router/web/guides/philosophy基本例子:https://reacttraining.com/rea

牛人博客

http://blog.csdn.net/zouxy09?viewmode=contents 机器视觉,深度学习牛人博客... http://blog.csdn.net/abcjennifer/article/details/7826917

Django博客项目之首页

一.Django-admin 1.创建表和注册表 settings.py文件: TIME_ZONE = 'Asia/Shanghai'    #支持中文数据 models.py文件内容: from django.db import models from django.contrib.auth.models import AbstractUser class UserInfo(AbstractUser):     """     用户信息     ""&q

Django——博客项目

博客项目 目前的目标是构建一个基于Django的前后端完整的博客系统,首先对项目流程整理如下: 1. 分析需求 1.1. 1.基于用户认证组件和Ajax实现登录验证 1.2. 基于forms组件和Ajax实现注册功能 1.3. 设计系统首页(文章列表渲染) 1.4. 设计个人站点页面 1.5. 文章详情页 1.6. 实现文章点赞功能 1.7. 实现文章的评论 1.7.1. 文章的评论 1.7.2. 评论的评论 1.8. 富文本编辑框和防止xss攻击 2. 设计表结构 module代码: from

Django实战之企业级博客

详情请交流  QQ  709639943 00.Python 从入门到精通 78节.2000多分钟.36小时的高质量.精品.1080P高清视频教程!包括标准库.socket网络编程.多线程.多进程和协程. 00.Django实战之用户认证系统 00.Django实战之企业级博客 00.深入浅出Netty源码剖析 00.NIO+Netty5各种RPC架构实战演练 00.JMeter 深入进阶性能测试体系 各领域企业实战 00.30天搞定大数据爬虫项目 00.零基础实战机器学学习 00.企业级实战

CSDN 牛人博客索引

安卓有关 (不分排名) 1.讲解安卓系统源码    http://blog.csdn.net/yangwen123 1.1 安卓源码   http://blog.csdn.net/wdaming1986 2.安卓运用和java  http://blog.csdn.net/brave2211/article/list/1 3.安卓开源项目,云 http://blog.csdn.net/forlong401?viewmode=contents 4. 安卓各种动画效果  http://blog.csd

设计node.js搭建多人博客的思路(不讲数据库)

1.1.4:搭建多人博客 1.功能分析 搭建一个简单的多人注册,登录,发表文章及登出功能的博客 2.设计目标 未登录:主页左侧导航显示home.login.register,右侧显示已发表文章,发表日期及作者 登陆后:主页左侧导航显示home.post.logout,右侧显示已发表文章,发表日期及作者 用户登录.注册.发表成功后 以及登出后都返回到主页 (1)未登录 主页 登录页 注册页 (2)登录后 主页 发表页 注意:没有登出页,点击logout后,退出登录并返回首页 3.路由规划 既然把设