文章目录
创建view的两种方式
创建视图函数的方式:
在相关的app下的view文件创建相关的视图函数,然后在urls中配置
创建视图函数:
def message_form(request):
return render(request,"mesage_form.html")
继承类的方式:
在相关的app下的view文件下创建类需要继承View类,然后在配置urls
创建视图类:
类需要继承 from django.views.generic.base import View
然后定义两个方法一个处理get请求一个处理post请求
from django.shortcuts import render
from django.views.generic.base import View
from django.contrib.auth import authenticate,login
from django.http import HttpResponseRedirect
from django.urls import reverse
# Create your views here.
class LoginView(View):
def get(self,request,*args,**kwargs):
return render(request,"html/login.html")
def post(self,request,*args,**kwargs):
user_name=request.POST.get("username","")
password=request.POST.get("password","")
# authenticate自动检测是否有该用户
user=authenticate(username=user_name,password=password)
if user is None:
return render(request,"html/login.html",{"msg":"用户名或密码错误"})
login(request,user)
# 跳转这里的index是在urls配置路由的name
return HttpResponseRedirect(reverse("index"))
然后在urls中配置
需要导入刚刚创建的类,还要导入TemplateView,然后配置好访问地址后使用创建好的类名.as_view()
参数name是这个路由的名字,在表单提交数据的action就可以使用{% url ‘login’ %}
from django.views.generic import TemplateView
from django.urls import path
from apps.users.views import LoginView
urlpatterns = [
path('', TemplateView.as_view(template_name="html/index.html"),name='index'),
path('login/', LoginView.as_view(),name='login'),
]
如何不需要任何处理视图的方法就能返回前端页面
需要在urls配置对应的路由地址和返回的页面就ok了,name是他的路由名方便我们调用
from django.views.generic import TemplateView
urlpatterns = [
path('', TemplateView.as_view(template_name="html/index.html"),name='index'),
]
自动校验用户是否存在
需要导包from django.contrib.auth import authenticate
user=authenticate(username=user_name,password=password)
将相关的参数传去后只需要判断是否为空就完成了校验是否有该用户的复杂操作了
from django.contrib.auth import authenticate
user=authenticate(username=user_name,password=password)
if user is None:
return render(request,"html/login.html",{"msg":"用户名或密码错误"})
跳转页面(HttpResponseRedirect)
from django.http import HttpResponseRedirect
# 页面跳转 index: url的name
return HttpResponseRedirect(reverse("index"))
reverse(“路由名”),在urls的name的名字
返回前端页面
# login_form返回的参数
return render(request,"html/login.html",{
"login_form":login_form
})
实现状态保持
login(request, 用户对象)
实例
# 登陆
class LoginView(View):
def get(self, request, *args, **kwargs):
if request.user.is_authenticated:
return HttpResponseRedirect(reverse("index"))
login_form = DynamicLoginForm()
return render(request, "html/login.html", {
"login_form": login_form
})
def post(self, request, *args, **kwargs):
# 使用Form校验
login_form = LoginForm(request.POST)
if not login_form.is_valid():
return render(request, "html/login.html", {"login_form": login_form})
user_name = login_form.cleaned_data["username"]
password = login_form.cleaned_data["password"]
# 使用传统的方式校验
# user_name=request.POST.get("username","")
# password=request.POST.get("password","")
# if not all([user_name,password]):
# return render(request,"html/login.html",{"msg":"请输入用户名或密码"})
#
# if len(password)<3 or len(password)>16:
# return render(request,"html/login.html",{"msg":"请输入符合要求的密码"})
# 表单验证
# authenticate自动检测是否有该用户
user = authenticate(username=user_name, password=password)
if user is None:
return render(request, "html/login.html", {"msg": "用户名或密码错误", "login_form": login_form})
# login:会帮助我们实现状态保持
login(request, user)
# 页面跳转 index: url的name
return HttpResponseRedirect(reverse("index"))
使用forms校验数据
基本校验
在app下创建forms.py文件
from django import forms
class LoginForm(forms.Form):
username=forms.CharField(required=True,min_length=2)
password=forms.CharField(required=True,min_length=3)
高级校验
可以对参数分别校验
实例:
class RegisterForm(forms.Form):
mobile=forms.CharField(required=True,min_length=11,max_length=11)
code=forms.CharField(required=True,max_length=4,min_length=4)
password=forms.CharField(required=True,max_length=18,min_length=6)
def clean_code(self):
mobile=self.cleaned_data["mobile"]
code=self.cleaned_data["code"]
# 实例化redis数据库
r = redis.Redis(host=REDIS_HOST, port=REDIS_POST, db=0, charset="utf8", decode_responses=True)
# 校验验证码是否正确
redis_code = str(r.get(mobile))
if not redis_code:
raise forms.ValidationError("手机验证码过期")
if not redis_code == code:
raise forms.ValidationError("手机验证码不正确")
return code
def clean_mobile(self):
mobile = self.cleaned_data["mobile"]
user = UserProfile.objects.filter(mobile=mobile)
# 注册用户
if user:
raise forms.ValidationError("该手机号以被注册")
return mobile
在视图函数调用forms类
实例化form类,将前端传过来的参数传过去,并进行判断值是否合法,如果不合法就将login_form返回到前端页面
# 使用form验证数据
login_form=LoginForm(request.POST)
# 获取form验证后的数据
user_name=login_form.cleaned_data["username"]
if not login_form.is_valid():
return render(request, "html/login.html", {"login_form": login_form})
展示form表单中验证没通过的错误信息
在前端的html中添加
{% for key,error in login_form.errors.items %}
{{ error }}
{% endfor %}
实例:
#导入form类
from apps.users.forms import LoginForm
#使用Form校验
login_form=LoginForm(request.POST)
#判断值是否符合要求,并报的错一并返回
if not login_form.is_valid():
return render(request, "html/login.html", {"login_form": login_form})
#取出user_name和password的值
user_name=login_form.cleaned_data["username"]
password=login_form.cleaned_data["password"]
# authenticate自动检测是否有该用户
user=authenticate(username=user_name,password=password)
if user is None:
return render(request,"html/login.html",{"msg":"用户名或密码错误","login_form": login_form})
login(request,user)
# 页面跳转
return HttpResponseRedirect(reverse("index"))
校验后,数据不符合要求如何处理?
从上面的代码看出已经将错返回到前端了,只需要在前端展示出来
django返回json数据的几种方式
使用字典转json的方法
这种构造太麻烦了不建议使用
首先需要构造好数据的进行序列化,在使用HttpResponse进行返回就ok了
return HttpResponse(json.dumps(json_list),content_type=“application/json”)
实例
class GoodsListView(View):
def get(self, request):
goods = Goods.objects.all()[:10]
#存放需要序列化的数据
json_list = []
for good in goods:
data_dict = {}
data_dict["name"] = good.name
data_dict["category"] = good.category.name
data_dict["market_price"] = good.market_price
#将需要的数据添加在要序列化的列表里
json_list.append(data_dict)
from django.http import HttpResponse
import json
return HttpResponse(json.dumps(json_list),content_type="application/json")
使用django的模型的model_to_dict函数
有些不能序列化,会报错
实例:
goods = Goods.objects.all()[:10]
#存放需要序列化的数据
json_list = []
from django.forms.models import model_to_dict
for good in goods:
data_dict=model_to_dict(good)
json_list.append(data_dict)
return HttpResponse(json.dumps(json_list),content_type="application/json")
使用django自带的serializable
这个还是挺好用的,上面的HttpResponse可以使用JsonResponse来进行简化
实例:
goods = Goods.objects.all()[:10]
#存放需要序列化的数据
json_list = []
from django.core import serializers
json_list=serializers.serialize("json",goods)
json_list=json.loads(json_list)
return JsonResponse(json_list,safe=False)
想要返回的json数据方便我们的阅读需要下载浏览器的扩展程序jsonview