IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> Django入门到放弃 学习笔记 08 -> 正文阅读

[Python知识库]Django入门到放弃 学习笔记 08

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

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

练习题

男女生分别建表

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

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>登录界面</h1>
    <form method="POST" action="/login.html/">
        {% csrf_token %}
        <p>用户:<input type="text" name="username"></p>
        <p>密码:<input type="text" name="password"></p>
        <p>性别:
            男<input type="radio" name="gender" value="1"><input type="radio" name="gender" value="2">
        </p>
        <p>
            <input type="checkbox" name="rmb" value="11">一个月免登录
        </p>
        <p><input type="submit" value="提交"></p>
        {{ msg }}
    </form>
</body>
</html>

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>当前用户:{{ request.session.user_info.nickname }}</h1>
    <a href="/logout.html">注销</a>
    <h3>异性列表</h3>
    <ul>
        {% for row in user_list %}
        <li>{{ row.nickname }}</li>
        {% endfor %}
    </ul>
</body>
</html>

others.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>当前用户:{{ request.session.user_info.nickname }}</h1>
    <a href="/logout.html">注销</a>
    <h3>有关系的异性列表</h3>
    <ul>
        {% for row in user_list %}
            {% if row.g__nickname %}
                <li>{{ row.g__nickname }}</li>
            {% else %}
                <li>{{ row.b__nickname }}</li>
            {% endif %}
        {% endfor %}
    </ul>
</body>
</html>

男女生合并为一张表

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

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <form method="POST" action="/login/">
        {% csrf_token %}
        <p>
            用户:<input type="text" name="username"> {{ obj.errors.username.0 }}
        </p>
        <p>
            密码:<input type="password" name="password"> {{ obj.errors.password.0 }}
        </p>
        <input type="submit" value="提交">
        {{ msg }}
    </form>
</body>
</html>
  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-09-30 11:53:45  更:2021-09-30 11:54:25 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 16:54:36-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码