表单与模型笔记
第八章
django表单功能由Form类实现,主要分为两种
1.django.forms.Form
2.django.forms.ModelForm # 结合模型生成的数据表单
表单form标签中的action用于设置用户提交的表单数据应由哪个路由来接收和处理,若为空,则提交由当前的路由来接收和处理。否则则跳转到属性action所指向的路由地址
提交请求由method决定
网页表单的构成
{% if v.errors %}
数据出错啦,错误信息:{{ v.errors }}
{% else %}
{% endif %}
定义表单类,新建表单文件
from django import forms
from .models import *
class VocationForm(forms.Form):
job = forms.CharField(max_length=20, label='职位')
title = forms.CharField(max_length=20, label='职称')
payment = forms.IntegerField(label='薪资') # 难道IntegerField设置数字成可自增自减
# 设置下拉框的值
# 查询模型PersonInfo的数据
value = PersonInfo.objects.values('name') # 获取模型字段中的姓名
# 将数据以为列表格式表示,列表元素为元组格式
choices = [(i+1, v['name']) for i, v in enumerate(value)] # 这里又为什么只显示v['name']
# 表单字段设为ChoiceField类型,用生成下拉框
person = forms.ChoiceField(choices=choices, label='姓名') # choices=choices下拉框
表单类中定义的字段和html标签的比较
字段label转化为label标签, forms.CharField转化为
input type="text",job的命名转换为控件的参数name,表单字段的max_length变为input控件的maxlength参数
# 表单类VocationForm的表单字段job
job = forms.CharField(max_length=20, label='职位')
# html标签
form源码分析
表单的定义过程、表单的字段类型和表单字段的参数类型是表单的核心功能。
8.4视图里使用
属性
prefix
prefix的作用就是为form命名,以区分多个表单,当然它实例化出来的html标签属性值是带有该参数
# 您可以将多个 Django 表单放在一个
initial是表单实例化的初始化数据,他只适用于模型数据传递给表单,再由表单显示在网页上
post请求从表单中获取数据然后保存起来到数据库中,get请求是在url链接上的id获取,然后再模型中找到相应的数据,把数据库中的数据写到表单上
无论是统计字符串还是列表
xx.count(传入统计的参数)
filter查询字段为0的情况下,就无法使用update,需要使用get_or_create(d),除主键外,只要有一个数据不同就插入
create(d),直接插入
8.5
表单类Form和模型实现数据交互最主要的问题是表单字段和模型字段的匹配性,如果将表单类Form改为ModelForm,就无需考虑字段匹配性的问题。
最好使用模型表单,表单类提取数据保存太难受了,我的报错问题:
ValueError: invalid literal for int() with base 10: ''
commit=False就会生成一个数据库对象,然后可以对该数据库对象进行增删改除,然后将修改的数据保存到数据库中。
# commit=True则直接将表单数据保存到数据库中
8.4,8.5表单的数据提取判断等逻辑都值得好好推敲
分割线
表单forms的属性和方法的源文件
在
django/forms/forms.py
主要类
class BaseForm: (类中)
属性调用不加(),函数调用加()
表单字段类型和模型字段类型类似
源码位置django/forms/fields.py
模型表单的源码
djano/forms/models.py
主要类
class BaseModelForm:中
表单类ModelForm于模型之间没有直接的数据交互,模型表单与模型之间的数据交互是由函数modelform_factory实现的,该函数将自定义的模型表单与模型进行绑定,从而实现两者之间的数据交互。
函数modelform_factory与类ModelForm定义在同一个源码文件中,它定义了9个属性
model, form=ModelForm, fields=None, exclude=None,
formfield_callback=None, widgets=None, localized_fields=None,
labels=None, help_texts=None, error_messages=None,
field_classes=None
模型字段与表单字段的转换规则
视图里使用form
实现表单数据与模型交互
待补充的两个小结
第九章 Admin后台系统
默认启用的Admin后台系统
'django.contrib.admin',
创建账户密码之前,确保项目已执行数据迁移,在数据库中创建相应的数据表
中文显示后台
把该中间件位于settings.py中的第三个中间件的位置
'django.middleware.locale.LocaleMiddleware',
注册模型到后台的两种方法
from django.contrib import admin
from .models import *
# 方法一:
# 将模型直接注册到admin后台
# admin.site.register(PersonInfo)
# 方法二:
# 自定义PersonInfoAdmin类并继承ModelAdmin
# 注册方法一,使用装饰器将PersonInfoAdmin和Product绑定
@admin.register(PersonInfo)
class PersonInfoAdmin(admin.ModelAdmin):
# 设置显示的字段
list_display = ['name', 'age'] # list_display显示人员信息
# 注册方法二
# admin.site.register(PersonInfo, PersonInfoAdmin)
后台默认会有增加xxx(设置verbose_name即为该字段,否则为数据表名)
源码分析 ModelAdmin
位置:django/contrib/admin/options.py中
ModelAdmin继承自BaseModelAdmin,而父类BaseModelAdmin的元类为MediaDefiningClass,因此Admin系统的属性和方法来及ModelAdmin和BaseModelAdmin
列出日常开发中常用的属性和方法(关于admin后台该展示的字段和方法)
fields 在数据新增或修改的页面设置可编辑的字段
exclude 在数据新增或修改的页面设置不可编辑的字段
fieldsets 改变新增或修改页面的网页布局
# 在数据列表页设置日期选择器
date_hierarchy = 'recordTime'
# 设置可搜索的字段
search_fields = ['job', 'title']
# 为数据列表页的字段id和job设置编辑状态
list_editable = ['job', 'title']
admin首页设置
修改title和header(登录界面)
admin.site.site_title = 'MyDjango后台管理' # 这个是现实在url栏目的上方的,像是网页的title
admin.site.site_header = 'MyDjango' # 只有这个显示在登录界面
若想将app应用的英文改为中文,也就是修改app在后台的名称,在admin所在文件夹的__init__.py文件夹下设置即可
from django.apps import AppConfig
import os
# 修改App在Admin后台显示的名称
# default_app_config的值来自apps.py的类名
default_app_config = 'index.IndexConfig'
# 获取当前App的命名
def get_current_app_name(_file):
return os.path.split(os.path.dirname(_file))[-1]
# 重写类IndexConfig
class IndexConfig(AppConfig):
name = get_current_app_name(__file__)
verbose_name = 'index应用'
admin后台系统首页的设置
包括:
项目应用的显示名称 :
init.py中
模型的显示名称:
models.py中的 verbose_name和verbose_name_plural
网页标题:
admin.py中设置admin.site.site_title 和
admin.site.site_head属性
如果项目中有多个应用,只需在一个应用下的admin.py设置即可(网页标题)
实现Admin的二次开发
重写ModelAdmin
get_readonly_fields函数是由BaseModelAdmin定义的,他获取readonly_fields的属性值,从而将模型字段设为只读属性,通过重写此函数可以自定义模型字段的只读属性,比如根据不同的用户角色来设置模型字段的只读属性。
设置字段样式
数据列表页显示的模型字段是由list_display设置的,每个字段的数据都来自数据表,并且数据以固定的字体格式显示在网页上,若要对某些字段的数据进行特殊处理,如设置数据的字体颜色,。
函数get_queryset()
用于查询模型的数据信息,然后再Admin的数据列表页展示。默认情况下,该函数执行全表数据查询,若要改变数据的查询方式,则可重新定义该函数,比如根据不同的用户角色执行不同的数据查询。
formfield_for_foreignkey
新增或修改数据时,设置外键可选值
自定义Admin后台系统
Admin后台系统为每个网页设置了具体的路由地址(啥意思)
重新定义Admin后台系统,比如常见的Xadmin和Django Suit,这些插件都是在Admin后台系统的基础上进行重新定义的
admin后台系统由类AdminSite实例化创建而成的,换句话说,重新定义类AdminSite即可实现Admin后台系统的自定义开发
admin后台系统的注册过程
当运行django时,Admin后台系统会随之运行。Admin的系统注册过程在源码apps.py中定义。
django.contrib.admin 中的 apps.py
综上
要实现Admin后台系统的自定义开发,就需要重新定义类AdminSite和改变Admin的系统注册过程。
简单讲解如何更换Admin后台系统的登录页面
在项目更目录下创建static文件,并加入所需的javascript文件和css文件,然后再templates文件夹中放置登录页面login.html,最后在MyDjango文件夹创建文件myadmin.py和myapps.py.
在myadmin.py中定义类MyAdminSite,他继承父类admin.AdminSite并重写方法admin_view()和get_urls(),从而更改admin()后台的登录界面