栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

Django入门到放弃 学习笔记 08

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Django入门到放弃 学习笔记 08

跟b站武沛齐老师的视频学习
对学习过程进行一些记录以便复习 同时自我督促 :D冲鸭

视频链接: 15天django入门到放弃-哔哩哔哩.

文章目录
  • 练习题
    • 男女生分别建表
    • 男女生合并为一张表
    • 补充自关联
  • 中间件
  • WSGI
  • MVC,MTV
  • Form组件

练习题 男女生分别建表

models.py:

from django.db import models


class Boy(models.Model):
    nickname = models.CharField(max_length=32)
    username = models.CharField(max_length=32)
    password = models.CharField(max_length=64)


class Girl(models.Model):
    nickname = models.CharField(max_length=32)
    username = models.CharField(max_length=32)
    password = models.CharField(max_length=64)


class B2G(models.Model):
    b = models.ForeignKey(to='Boy', on_delete=models.DO_NOTHING)
    g = models.ForeignKey(to='Girl', on_delete=models.DO_NOTHING)

urls.py:

from django.contrib import admin
from django.urls import path, re_path
from app01.views import account, love

urlpatterns = [
    path('admin/', admin.site.urls),
    re_path('^login.html/', account.login),
    re_path('^logout.html/', account.logout),
    re_path('^index.html/', love.index),
    re_path('^others.html/', love.others),
]

account.py:

from django.shortcuts import render, redirect, HttpResponse
from app01 import models

def login(request):
    if request.method == 'GET':
        return render(request, 'login.html')
    else:
        username = request.POST.get('username')
        password = request.POST.get('password')
        gender = request.POST.get('gender')
        print(username, password, gender)
        rmb = request.POST.get('rmb')
        if gender == '1':
            obj = models.Boy.objects.filter(username=username, password=password).first()
        else:
            obj = models.Girl.objects.filter(username=username, password=password).first()
        if not obj:
            # 登陆失败
            return render(request, 'login.html', {'msg': '用户名或密码错误'})
        else:
            # request.session['user_id'] = obj.id
            # request.session['gender'] = gender
            # request.session['username'] = username
            request.session['user_info'] = {
                'user_id': obj.id,
                'gender': gender,
                'username': username,
                'nickname': obj.nickname
            }
            return redirect('/index.html/')


def logout(request):
    request.session.clear()  # 删除cookie = 超时时间设为0 不删数据库
    # request.session.delete(request.session.session_key)  # 删除数据库
    return redirect('/login.html/')

love.py:

from django.shortcuts import render, redirect, HttpResponse
from app01 import models


def index(request):
    # 简单的情况往上写
    if not request.session.get('user_info'):
        return redirect('/login.html')
    else:
        # 男:女生列表
        # 女:男生列表
        gender = request.session.get('user_info').get('gender')
        if gender == '1':
            user_list = models.Girl.objects.all()
        else:
            user_list = models.Boy.objects.all()
        return render(request, 'index.html', {'user_list': user_list})


def others(request):
    """
    获取与当前用户有关系的异性
    :param request:
    :return:
    """
    current_user_id = request.session.get('user_info').get('user_id')
    gender = request.session.get('user_info').get('gender')
    if gender == '1':
        userlist = models.B2G.objects.filter(b_id=current_user_id).values('g__nickname')
    else:
        userlist = models.B2G.objects.filter(g_id=current_user_id).values('b__nickname')
    return render(request, 'others.html', {'user_list': userlist})

login.html:




    
    Title


    

登录界面

{% csrf_token %}

用户:

密码:

性别: 男

一个月免登录

{{ msg }}

index.html:




    
    Title


    

当前用户:{{ request.session.user_info.nickname }}

注销

异性列表

    {% for row in user_list %}
  • {{ row.nickname }}
  • {% endfor %}

others.html:




    
    Title


    

当前用户:{{ request.session.user_info.nickname }}

注销

有关系的异性列表

    {% for row in user_list %} {% if row.g__nickname %}
  • {{ row.g__nickname }}
  • {% else %}
  • {{ row.b__nickname }}
  • {% endif %} {% endfor %}
男女生合并为一张表
class UserInfo(models.Model):
    nickname = models.CharField(max_length=32)
    username = models.CharField(max_length=32)
    password = models.CharField(max_length=64)
    gender_choices = (
        (1, '男'),
        (2, '女'),
    )
    gender = models.IntegerField(choices=gender_choices)

反向关联使用 related_query_name:

# obj对象.u2u__set.all() 两个foreignkey无法查找
# obj对象男.b__set.all()
# obj对象女.a__set.all()
class U2U(models.Model):
    g = models.ForeignKey('UserInfo', related_query_name='a', on_delete=models.DO_NOTHING)
    b = models.ForeignKey('UserInfo', related_query_name='b', on_delete=models.DO_NOTHING)

或 related_name:

# obj对象男.b.all()
# obj对象女.a.all()
class U2U(models.Model):
    g = models.ForeignKey('UserInfo', related_name='a', on_delete=models.DO_NOTHING)
    b = models.ForeignKey('UserInfo', related_name='b', on_delete=models.DO_NOTHING)

related 的应用例子:

class UserType(models.Model):
    title = models.CharField(max_length=32)

class User(models.Model):
    username = models.CharField(max_length=32)
    ut = models.ForeignKey('UserType', related_name='xxxx')
    
# 反向: user_set ==> xxxx
# related_query_name 反向: user_set ==> xxxx_set

U2U 表新增数据的两种方式:

def test(request):
	# 传id
    models.U2U.objects.create(b_id=2, g_id=6)
    # 传对象(foreignkey特殊)
    boy = models.UserInfo.objects.filter(gender=1, id=2).first()
    girl = models.UserInfo.objects.filter(gender=2, id=6).first()
    models.U2U.objects.create(b=boy, g=girl)

U2U查找关联对象的方式:

def test(request):
    lb = models.UserInfo.objects.filter(id=1).first()
    result = lb.girls.all()
    for u in result:
        print(u.g.nickname)

    return HttpResponse('ok')
补充自关联
class UserInfo(models.Model):
    nickname = models.CharField(max_length=32)
    username = models.CharField(max_length=32)
    password = models.CharField(max_length=64)
    gender_choices = (
        (1, '男'),
        (2, '女'),
    )
    gender = models.IntegerField(choices=gender_choices)

    m = models.ManyToManyField('UserInfo')

查找:

# M2M自关联特性
	obj = models.UserInfo.objects.filter(id=1).first()
	# from_userinfo_id
	obj.m => select xx from xx where from_userinfo_id = 1
	# to_userinfo_id
	obj.userinfo_set => select xx from xx where to_userinfo_id = 1
# 定义
	# 前面列:男生ID
	# 后面列:女生ID
# 应用
	# 男生对象
	obj = models.UserInfo.objects.filter(id=1).first()
	# 根据男生ID=1查找关联的所有女生
	obj.m.all()

	#女生对象
	obj = models.UserInfo.objects.filter(id=4).first()
	# 根据女生ID=4查找关联的所有男生
	obj.userinfo_set.all()

应用:多级评论

class Comment(models.Model):
    new_id = models.IntegerField()
    content = models.CharField(max_length=32)
    user = models.CharField(max_length=32)
    reply = models.ForeignKey('Comment', null=True, blank=True)
    # 形成阶梯
中间件

p124 130-133(没看)

WSGI

Django 生命周期:

MVC,MTV

models(数据库,模型)
views(html模板)=> templates
controllers(业务逻辑处理)=> views

Form组件

Form 验证
 - 需要对请求数据做验证
 - 获取到数据然后进行验证
   - login:
     邮箱正则
   - register:
     邮箱正则

问题:
 - 无法记住上次提交内容,刷新页面数据消失
 - 重复进行用户数据校验:正则,长度,是否为空

Django 提供 Form 组件:

 1. 定义规则
  from django.forms import Form, fields
  class xxx(Form):
    xx = fields.CharField(required=True, max_length…, error_message=…)

 2. 使用
  obj = xxx(request.POST)
  # 是否校验成功
  v = obj.is_valid() # 根据字段名称匹配 html 标签 name 属性 = Form 类字段名
  # 所有错误信息
  obj.errors
  # 正确信息
  obj.cleaned_data

views.py:

from django.shortcuts import render, redirect
from django.forms import Form, fields


class LoginForm(Form):
    # 正则验证:不能为空,6-18
    username = fields.CharField(
        max_length=18,
        min_length=6,
        required=True,
        error_messages={
            'required': '用户名不能为空',
            'min_length': '太短了',
            'max_length': '太长了',
        }
    )
    # 正则验证:不能为空,16+
    password = fields.CharField(min_length=16, required=True)


def login(request):
    if request.method == "GET":
        return render(request,'login.html')
    else:
        # user = request.POST.get('username')
        # pwd = request.POST.get('password')
        # if user == 'root' and pwd == '123':
        #     return redirect("www.baidu.com")
        # else:
        #     return render(request, 'login.html', {'msg': "用户名或密码错误"})
        obj = LoginForm(request.POST)
        if obj.is_valid():
            print(obj.cleaned_data)  # 字典类型
            # .create(**obj.cleaned_data)
        else:
            print(obj.errors['username'][0])
            print(obj.errors['password'][0])
            return render(request, 'login.html', {'obj': obj})

login.html:




    
    Title


    
{% csrf_token %}

用户: {{ obj.errors.username.0 }}

密码: {{ obj.errors.password.0 }}

{{ msg }}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/280816.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号