文章目录
视图view+模板template+模型model
python manager.py runserver [port]
python manager.py startapp [appname]
请求:
- META
- REMOTE_ADDR 请求的IP地址
- HTTP_USER_AGENT 用户请求终端信息
- Content-Type
- text/plain 普通文档
- text/xml XML文档
- application/json json数据类型
视图:
接受请求返回响应
1.定义URL
path(route,view,name,**kwargs)
include(urls,namespace)
#########示例#########
path('sight/image/list/',SightImageView,name='SightImageView')
path('account/',include('accounts.urls'))
2.获取URL参数
-
url/path传参
-
view视图取参
re_path(r'(?P<arg>表达式)/',view,name) path('.../<int:arg>/',view,name) def uname_view(request,arg) #########示例######### path('article/<int:page>',article_list,name='article_list') def article_list(request,page) re_path(r'^article/(?P<month>0?[1-9]|1[012])/$',article_list,name='article_list') def article_list(request,month)
3.获取GET/POST参数
request.GET.get('arg','')
#########示例#########
http:127.0.0.1:8080/?name=jinhu
request.GET.get('name',None)
4.响应HTML
磁盘读取+替换特殊字符+发送浏览器
render(request,template_name,{})
#########示例#########
data = {
'name':'jinhu'
}
render(request,'hello.html',{
'data':data
})
5.重定向
redirect(route)
#########示例#########
redirect('user/login/')
6.静态文件
-
settings.py
MEDIA_URL='/media/' MEDIA_ROOT=os.path.join(BASE_DIR,'medias')
-
urls.py
urlpatterns += [ url(r'^media/(?P<path>.*)$,serve,{ 'document_root':settings.MEDIA_ROOT }) ]
7.class重写视图
url('hello/',HomeView.as_view(),name='hello')
class HomeView(TemplateView):
template_name='hello.html'
模板
jinja2在jinja2文件夹,DTL在templates文件夹
{{ object.attribute }} {% tag %}
1.模板标签
-
循环控制
{% for item in data_list %} ... {% empty %} 或者 {% else %} ... {% endfo %} {% for key,value in data.items%} {{ key }}:{{ value }} {% endfo %} {% cycle 'row1' 'row2' %} 或者 {{loop.cycle('row1','row2')}}
-
条件控制
{% if condition_a %} ... {% elfi condition_b %} ... {% else %} .. {% endif %}
-
URL解析
{% url 'url_name' params %} 或者 {{url_for('index')}} {% load static %} <img src="{% static "image/cat.jpg" %}" alt="Cat">
-
当前时间显示
{% now "JS F Y H:i" %}
2.模板继承
-
基Html用block圈出
-
子Html用extends继承
-
子Html用super复用
{% extends "base.html" %} {% block sidebar %} {{ block.super }} {% endblock %}
3.添加公共
{% include "footer.html" %}
4.过滤器
{{ value| filter_name:params }}
- 四舍五入:floatformat
- 默认显示:default:“”/default(“”)
- 字符串截取:truncatechars
- Built-in template tags and filters | Django 文档 | Django (djangoproject.com)
自定义过滤器
-
任意模块下新建templatetags的python包
-
内部新建脚本any_name.py
register = template.Library() @register.filter(name='uname_format') def uname_format(text, len): return f"{text[:len]}***" {% load any_name %} {{ value|uname_format:2 }}
ORM模型:
1.元数据 Meta
- db_table ordering verbose_name abstract
- proxy 共享数据库表,添加新的方法、属性和管理器
2.关联关系
-
一对一:OneToOneField 返回对象
-
一对多:ForeignKey 返回列表
-
多对多:ManyToManyField
-
复合模型
content_type = models.ForeignKey(ContentType, on_delete=models.SET(None)) object_id = models.IntegerField("关联模型") content_object = GenericForeignKey('content_type','object_id') # 出现在多个被关联的对象 images = GenericRelation(ImageRelated, verbose_name='关联图片', related_query_name='rel_sight_images')
3.CRUD
-
C
# 单个新增 User.objects.create(...) # 多个新增 u1 = User(...) u2 = User(...) User.objects.bulk_create([u1,u2]) # 保存 User(...).save()
-
R
User.objects.get(...) User.objects.get_object_or_404(...) User.objects.get_or_create(...) latest/earliest/first/last/all
4.QuerySet结果集
-
count() exists() all() none() filter() exclude() order_by()
-
字段名称__查询条件
id__exact id__lte id__isnull id__icontains UserProfile.objects.filter(user__username='管理员')
-
filter & Q
User.objects.filter(name_icontains='',status='') User.objects.filter(name_icontains='') & User.objects.filter(status='') query1 = Q(name_icontains='',status='') query2 = Q(name_icontains='') & Q(status='') User.objects.filter(query2)
5.分页处理
p = Paginator(objects,2) #每页几条
page = page(3) #第三页
6.聚合统计
User.objects.all().aggregate(Function()) #返回一个结果
User.objects.annotate(Function()) #返回多个结果
-
事务管理
-
自动提交
@transaction.atomic() def function(): ... def function(): with transaction.atomic() ...
-
手动提交
def function(): transaction.set_autocommit(False) try: ... a.save() transaction.commit() except: transaction.rollback()
-
表单
1.表单的使用
-
创建表单类
class LoginForm(forms.Form)
-
添加到表单视图
-
渲染到模板
<form action="." method="post"> {{ form.as_p() }} {% csrf_token %} </form>
-
视图中处理表单数据
def form(request): if request.method="POST": form=LoginForm(request.POST) if form.is_valid(): data=form.cleaned_data else: form=LoginForm() return render(request, 'form.html',{ 'form':form })
2.表单验证 clean_xx
-
定义clean_xx方法
-
获取对应字段验证
-
失败返回异常,最后返回data
def clean_username(self): data = self.cleaned_data['username'] if not data: raise forms.ValidationError('') return data
3.多个字段验证 clean
def clean(self):
data = super().clean()
if self.errors:
return
username = data['username']
...
return data
4.ORM创建表单
class UserForm(ModelForm):
class Meta:
model = User #使用的ORM
field = [] #ORM哪些需要在表单
exclude = []
labels = {
'username': '手机号码'
}
widgets = {
'password': forms.PasswordInput(attrs={
})
}
error_messages = {
'username': {
'max_length': '不够长'
}
}
def clean_xxx(self):
...
5.上传文件
-
HTML实现
<form action='.' method='post' enctype='multipart/form-data'> {% csrf_token %} <input type='file' name='avatar'> <input type='submit' value='提交'> </form> def xxx(request): if request.method == "POST": file = request.FILES.get('avatar',None) if file: filename=os.path.join(settings.MEDIA_ROOT,'...') with open(filename, 'wb+') as t: for chunk in file.chunks(): t.write(chunk)
-
Django表单实现
class AvatarUploadForm(form.Form): avatar = forms.ImageField() <form action='.' method='post' enctype='multipart/form-data'> {% csrf_token %} {{ form.as_p }} <input type='submit' value='提交'> </form> def xxx(request): if request.method == "POST": form = AvatarUploadForm(data=request.POST,files=request.FILES) if form.is_valid(): file = form.cleaned_data['avatar'] filename=os.path.join(settings.MEDIA_ROOT,'...') with open(filename, 'wb+') as t: for chunk in file.chunks(): t.write(chunk)
-
ORM上传
class User(models.model): ... avatar = models.ImageField('',upload_to='avatar/%Y%m%d') class UserChangeForm(forms.ModelForm): class Meta: model = User <form action='.' method='post' enctype='multipart/form-data'> {% csrf_token %} {{ form.as_p }} <input type='submit' value='提交'> </form> def xxx(request): if request.method == "POST": form = UserChangeForm(data=request.POST,files=request.FILES) if form.is_valid(): form.save()