python全栈--django基础02
一 模版
一模版的组成
HTML代码+逻辑控制代码
二 逻辑控制代码的组成
1 变量(使用双大括号来引用变量)
{{var_name}}
2 标签(tag)的使用(使用大括号和百分比的组合来表示使用tag)
{%load staticfiles%}
3 过滤器(filter)的使用
{{ship_date|date:"Fj,Y"}},ship_date变量传给date过滤器,date过滤器通过使用"FJ,Y"这几个参数来格式化日期数据。"|"代表类似Unix命令中的管道操作。
三 常用标签
1 {%if%} 的使用
可以使用你的and,or,not来组织的逻辑。但不允许and和or同时出现在条件语句中。新版本中已经支持了 {%elif%} 这样的用法。
2 {% for %}的使用
用来循环一个序列, 还可以使用reserser关键字来进行倒序遍历,一般可以先用if语句判断序列是否为空,再进行遍历;还可以使用empty关键字来进行为空时的跳转

3 {%csrf_token%}
用于生成csrf_token的标签,用于防治跨站攻击验证。
注意如果你在view的index里用的是render_to_response方法,此时标签由于没有上下文的关系所以没有效果,需要:

或者直接使用render。
其实,这里是会生成一个input标签,和其他表单标签一起提交给后台的。
4 {% load %}: 加载标签库
5 {% url %}: 引用路由配置的地址

6 {% with %}:用更简单的变量名替代复杂的变量名

7 {% verbatim %}: 禁止render
{% verbatim %}
{{ hello }}
{% endverbatim %}
四 常用过滤器
1 add : 给变量加上相应的值
2 addslashes: 给变量中的引号前加上斜线
3 capfirst : 首字母大写
4 cut : 从字符串中移除指定的字符
5 date : 格式化日期字符串
6 default : 如果值是False,就替换成设置的默认值,否则就是用本来的值
7 default_if_none:如果值是None,就替换成设置的默认值,否则就使用本来的值

五 模版的包含和继承
包含:{% include %} 允许在模版中包含其他模版的内容。
标签的参数可以是:模版名称,变量,字符串
{% include 'nav.html' %}
{% include 'app/nav.html'%}
{% include template_name %}

继承:本质上说,模版继承就是先构造一个基础框架模版,而后在其子模版中对它所包含站点共用部分和定义进行重载。
1 {% block %}
定义块
2 {% extends %}
继承父模版

注意:
1 包含和继承可以把一些共用的网页模块独立出来,以减少代码的冗余。
2 如果在模块里使用{% extends %}d的话,这个标签必须在所有模版标签的最前面,否则模版继承不工作。
3 通常尽可能模版里的{% block %}越多越好,子模版不必定义所有的父block
4 如果你需要父模版的块内容,{{block.super}}变量可以帮你完成工作,当你需要为父块添加内容而不是取代它的时候这就很有用。
5 不能在同一模版(无论是父模版还是子模版)里定义多个同名{% block %} ,因为块标签同时在两个地方工作,不仅在子模版中,而且在父模版中也填充内容,如果子模版有两个同名的标签,父模版将不能决定使用哪一个块内容来使用。
二 admin的配置
django admin是django自带的一个后台app,提供了后台的管理功能。
基础知识点:
一 认识ModelAdmin
管理界面的定制类,如需扩展特定的model界面需从该类继承
二 注册medel类到admin的两种方式:
1 使用register的方法
2 使用register的装饰器
三 掌握一些常用的设置技巧
list_display: 指定要显示的字段
search_fields: 指定搜索的字段
list_filter: 指定列表过滤器
ordering:指定排序字段

三 Form
一 什么是Form?什么是DjangoForm?
Django表单系统中,所有的表单类都作为django.forms.Form的子类创建,包括ModelForm
关于django的表单系统,主要分两种
基于django.forms.Form: 所有表单类的父类
基于django.forms.ModelForm: 可以和模型类绑定的Form
实例:实现添加出版社信息的功能
二 不使用Django Form的情况

三 使用Form的情况
首先,在app01中建立forms.py
#########################################################
#app01下新建的forms.py
from django import forms
class Mypub_form(forms.Form):
name = forms.CharField(label='名称',error_messages={'required':'必填'})
address = forms.CharField(label='地址',error_messages={'required':'必填'})
city = forms.CharField(label='城市',error_messages={'required':'必填'})
state_province = forms.CharField(label='省份',error_messages={'required':'必填'})
country = forms.CharField(label='国家',error_messages={'required':'必填'})
website = forms.URLField(label='网址',error_messages={'required':'必填'})
#######################################################
#app01.views
def add_publisher(req):
if req.method=='POST':
# #不使用django form
# print(req.POST)
# name=req.POST['name']
# address=req.POST.get('address')
# city=req.POST['city']
# province=req.POST['province']
# country=req.POST['country']
# website=req.POST['website']
# Publisher.objects.create(
# name=name,
# city=city,
# address=address,
# state_province=province,
# country=country,
# website=website
# )
# return HttpResponse("添加出版社信息成功!")
#使用django form的情况
Mypub_form_obj=Mypub_form(req.POST)
if Mypub_form_obj.is_valid():
Publisher.objects.create(
name=Mypub_form_obj.cleaned_data["name"],
address=Mypub_form_obj.cleaned_data["address"],
city=Mypub_form_obj.cleaned_data["city"],
state_province=Mypub_form_obj.cleaned_data["state_province"],
country=Mypub_form_obj.cleaned_data["country"],
website=Mypub_form_obj.cleaned_data["website"],
)
return HttpResponse("添加出版社信息成功!")
else:
Mypub_form_obj=Mypub_form()
return render(req,'add_publisher.html',locals())
#######################################################
#add_publisher.html
<body>
<form action="{% url 'add_pub' %}" method="post">
{% csrf_token %}
{# 名称:<input type="text" name="name"><br>#}
{# 地址:<input type="text" name="address"><br>#}
{# 城市:<input type="text" name="city"><br>#}
{# 省份:<input type="text" name="province"><br>#}
{# 国家:<input type="text" name="country"><br>#}
{# 网址:<input type="text" name="website"><br>#}
{# <input type="submit" value="提交"><br>#}
{{ Mypub_form_obj.as_p }}
<input type="submit" value="提交"><br>
</form>
</body>
四 使用ModelForm的情况
#######################################################
#app01.views
def add_publisher(req):
if req.method=='POST':
# #不使用django form
# print(req.POST)
# name=req.POST['name']
# address=req.POST.get('address')
# city=req.POST['city']
# province=req.POST['province']
# country=req.POST['country']
# website=req.POST['website']
# Publisher.objects.create(
# name=name,
# city=city,
# address=address,
# state_province=province,
# country=country,
# website=website
# )
# return HttpResponse("添加出版社信息成功!")
#使用django form的情况
Mypub_form_obj=Mypub_form(req.POST)
if Mypub_form_obj.is_valid():
# Publisher.objects.create(
# name=Mypub_form_obj.cleaned_data["name"],
# address=Mypub_form_obj.cleaned_data["address"],
# city=Mypub_form_obj.cleaned_data["city"],
# state_province=Mypub_form_obj.cleaned_data["state_province"],
# country=Mypub_form_obj.cleaned_data["country"],
# website=Mypub_form_obj.cleaned_data["website"],
# )
Mypub_form_obj.save()
return HttpResponse("添加出版社信息成功!")
else:
Mypub_form_obj=Mypub_form()
return render(req,'add_publisher.html',locals())
#######################################################
#add_publisher.html
<body>
<form action="{% url 'add_pub' %}" method="post">
{% csrf_token %}
{# 名称:<input type="text" name="name"><br>#}
{# 地址:<input type="text" name="address"><br>#}
{# 城市:<input type="text" name="city"><br>#}
{# 省份:<input type="text" name="province"><br>#}
{# 国家:<input type="text" name="country"><br>#}
{# 网址:<input type="text" name="website"><br>#}
{# <input type="submit" value="提交"><br>#}
{{ Mypub_form_obj.as_p }}
<input type="submit" value="提交"><br>
</form>
</body>

思考:为什么有的显示汉子,有的显示英文
总结:
使用Django中Form可以大大简化代码,常用的表单功能特性都整合到了Form中,而ModelForm可以和Model进行绑定,更进一步简化操作。
四 Form 验证
django提供了3种方式来验证表单
实例:自定义验证,不能插入重名的出版社名称。
一 表单字段的验证器

二 clean_filedname,验证字段,针对某个字段进行验证。

三 表单clean方法,可针对整个表单进行验证

参考文档:https://www.cnblogs.com/yuanchenqi/articles/5716193.html

浙公网安备 33010602011771号