跟着老齐学django笔记第二章

加载静态文件

将bootstrap下载好,放入statics(这个是自己命名的,跟配置文件的静态目录相同)文件夹下面,然后在template下面创建header.html和footer.html这里大家可以到网上找自己喜欢的模板自定义前段界面,这里主要是跟着书走,就不折腾了。

  • header.html
{% load static %}
    <nav class="navbar navbar-default">
        <div class="container">
          <ul class="nav navbar-nav" role="navigation">
              <li><a href="{% url 'blog:blog_title' %}" >博客</a></li>
          </ul>
          <ul class="nav navbar-nav navbar-right" style="margin-right: 30px;">
              <li><a href="#">登录</a></li>
          </ul>
        </div>
      </nav>
  • footer.html
<div class="container">
    <hr>
    <p class="text-center"> Copy right moyu</p>

</div>
  • 在base.html中添加header和footer
{% load static %}
<!DOCTYPE html>
<html lang="zh-hans">
    <head>
        <title>{% block title %}{% endblock %}</title>
    
        {% include 'admin/includes/css-part.html' %}
           
        <link rel="stylesheet" type="text/css" href="{% static '/css/bootstrap.min.css' %}">
           
    
    
        {% include 'admin/includes/js-part.html' %}
    
        <script src="https://unpkg.com/element-ui/lib/index.js"></script>      
        <script type="text/javascript" src="{% static '/admin/js/vendor/jquery/jquery.min.js' %}"></script>
        <script type="text/javascript" src ="{% static '/js/bootstrap.min.js' %}"></script>
     </head>
    <body>
       
           <!-- Content -->
           {% include 'header.html' %}
        
            
           <div class="container">
             <div class = "content">        
            {% block content %}
            {% endblock %}
        </div>
        <!-- EndContent-->
       
        {% include 'footer.html' %}
      </div>
    </body>
</html>

用户登录

  • 创建用户应用,注册用户应用,并在users文件夹下新建form.py,理解django的表单类
from django import forms


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

    
  • 接下来在users目录下和项目主目录下分别添加路由,这里省略了,跟第一节的添加方式一样
  • 然后编写views.py
from django.shortcuts import render
from django.http import HttpResponse
from django.contrib.auth import authenticate,login
from .form import LoginForm


#登录视图
def user_login(request):
    if request.method == "POST" :    #判断请求方法
        login_form = LoginForm(request.POST)
        if login_form.is_valid():       #验证数据有效性
            cd = login_form.changed_data   #字典化
            user = authenticate(username = cd['username'],password=cd['password'])  #判断用户是否合法

            if user:
                login(request,user)
                return HttpResponse("登陆成功!")
            else:
                return HttpResponse("用户名密码不匹配!")
        else:
            return HttpResponse("无效登录!")

    else:
        login_form = LoginForm()

    return render(request,"users/login.html",{"form": login_form})
  • 按书上的写法有点小坑,估计是版本问题,这里补充下,环境python3.9,django 3.0,版本的

..这里遇到个坑,点登录按钮毫无反应,看了半天没问题,就是不知道问题出在哪里,哎,后来用内置方法登录也是一样的问题,看来是书上的模板文件写法有问题,自己重新谢了个login.html问题解决了

# 定义当前子应用的所有路由
from django.urls import path,re_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() ,name= "user_login"),
        path('logout/',auth_views.LogoutView.as_view,name = "logout")
]

使用内置的登入和登出方法,在settings中配置登陆后的跳转页面
LOGIN_REDIRECT_URL = '/blog/'

  • 首页导航中判断用户是否登录
<ul class="nav navbar-nav navbar-right" style="margin-right: 30px;">
           {% if request.user.is_authenticated %}
           <li><a href="#">{{request.user.username }}</a></li>
           <li><a href="{%url 'users:logout'%}">注销登录</a></li>
               {% else %}
             <li><a href="{% url 'users:user_login' %}">登录</a></li>
           {% endif %}
         </ul>

这里书上用的不是request.user而是直接用的user没有测试是否可以
配置登出,我也使用的内置登出方法,模板覆盖跟原来一样
登录退出到此就结束了,接下来用户注册问题


用户注册

  • 在users的form里面增加一个注册用户的表单类
 class RegistrationForm(forms.ModelForm):  #对model进行修改
    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("密码不匹配。")
        return cd['password2']

然后添加路由

 path('register',views.register,name="user_register")

编写register.html

{% extends "base.html"%}

{% load static %}

{% block title %}用户注册{% endblock %}

{% block content %}
<div class="row text-center vertical-middle-ms">
    <h1>注册用户</h1>
    <P>如果已经有账户,请<a href="{% url 'users:user_login' %}">登录</a>,没有请注册</P>
    <form class="form-horizontal" action="{{ app_path }}" method="POST">
          {% csrf_token %}
        <!-- {{ form.as_p }} -->
        <div class="form-group">
            <label for="{{ form.username.id_for_label }}" class="col-sm-2 control-label">Username</label>
            <div class="col-sm-10">
              {{ form.username }}            
            </div>
          </div>
          <div class="form-group">
            <label for="{{ form.email.id_for_label }}" class="col-sm-2 control-label">Email</label>
            <div class="col-sm-10">
              {{ form.email }}            
            </div>
          </div>
          <div class="form-group">
            <label for="{{ form.password.id_for_label }}" class="col-sm-2 control-label">password</label>
            <div class="col-sm-10">
              {{ form.password }}            
            </div>
          </div>
          <div class="form-group">
            <label for="{{ form.password.id_for_label }}" class="col-sm-2 control-label">Confirm password</label>
            <div class="col-sm-10">
              {{ form.password2 }}            
            </div>
          </div>
         <input type="submit" class="btn btn-default" value="注册">
    </form>
</div>

{% endblock %}

注册完成,但是没有手机号,自带的用户字段太少,接下来拓展用户字段,在models中编写。

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

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

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

然后修改views

def register(request):
    if request.method == "POST":
        user_form = RegistrationForm(request.POST)
        user_profile = UserProfileForm(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()
            new_profile = user_profile.save(commit=False)
            new_profile.user = new_user
            new_profile.save()
            return HttpResponse("successfully")
        else:
            return HttpResponse("sorry!you can't register.")
    else:
        user_form = RegistrationForm()
        user_profile = UserProfileForm()
        return render(request,"users/register.html",{"form":user_form,"profile":user_profile})

最后修改template,也就是register.html,添加一行手机即可

 <div class="form-group">
           <label for="{{ profile.phone.id_for_label }}" class="col-sm-2 control-label">Phone</label>
           <div class="col-sm-10">
             {{ profile.phone }}            
           </div>
         </div>

在登录页面引入注册的链接,这里文中没有提到
<a href="{% url 'users:user_register' %}">注册</a>

关于密码

修改和重置密码都是使用的内置方法,这里直接在url里添加一下就可以使用了,因为我安装了simpleui,所以这些template都有了,直接可以运行看效果,url里做入下更改
```
path('login/',auth_views.LoginView.as_view() ,name= "user_login"),
path('logout/',auth_views.LogoutView.as_view(),name = "logout"),
path('register/',views.register,name="user_register"),
path('password_reset/', auth_views.PasswordResetView.as_view(), name='password_reset'),
path('password_reset/done/', auth_views.PasswordResetDoneView.as_view(), name='password_reset_done'),
path('reset///', auth_views.PasswordResetConfirmView.as_view(), name='password_reset_confirm'),
path('reset/done/', auth_views.PasswordResetCompleteView.as_view(), name='password_reset_complete'),
path('password_change/', auth_views.PasswordChangeView.as_view(), name='password_change'),
path('password_change/done/', auth_views.PasswordChangeDoneView.as_view(), name='password_change_done'),

* 老齐书上用的视图方法,在我的django3.0里都没有,我这里都是用的类视图,不过效果一样,大家可以参考下
* 最后在header菜单的用户名菜单下面,增加修改密码的链接即可
posted @ 2021-03-01 11:38  shmily墨鱼  阅读(119)  评论(0)    收藏  举报