跟着老齐学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/
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菜单的用户名菜单下面,增加修改密码的链接即可