django View相关操作

创建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
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值