路由与反向解析:
在项目工程目录下的urls定义namespace别名,在app模块下urls定义name
# 工程目录下urls
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^stu/$', include('stu.urls', namespace='s')), # 学生
url(r'^grade/$', include('grade.urls', namespace='g')), # 班级
url(r'^uauth/$', include('uauth.urls', namespace='u')) # 用户
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) # 加载文件上传路径
]
# APP模块目录下urls
# stu app模块
from django.conf.urls import url
from stu import views
urlpatterns = [
url(r'^addstu/', views.addStu, name='add'),
url(r'^addstuinfo/(?P<stu_id>\d+)/', views.addStuInfo, name='addinfo'),
url(r'^index/', views.index),
url(r'^stupage/',views.stuPage),
]
注意: rul中的r表示原生字符,不转义,要分别咋前后加上^和$,表示开始和结束,不然会模糊匹配,比如stu和addstu,请求访问addstu会进入stu方法
前台请求url方式:
# 第一种
<a href="/stu/addstu/">添加学生</a>
<form method="post" action="/stu/addstu">
# 第二种,使用别名
<a href="{% url 's:add' %}">添加学生</a>
<form method="post" action="{% url 's:add' %}">
请求方式
post -- 提交数据隐藏了,前端上传数据到后端数据库使用post请求,常用于提交表单
get -- 提交数据在url上, ?后跟参数,&用来连接多个参数,但是对参数的数量有限制,每个浏览器的限制不同,前端查询获取后端数据使用get请求
put 更新全部数据
patch 更新局部数据
delete:删除数据
view 方法
响应
render:第一个固定参数,第二个是tempaltes中定义的模板页面,第三个是返回到页面的数据
def index(request):
# 获取所有学生信息
if request.method == 'GET':
# 首页获取学生所有信息
stuinfos = StudentInfo.objects.all()
return render(request, 'index.html',{'stuinfos':stuinfos})
HttpResponseRedirect 重定向
返回到另一个方法继续进行处理,有两种方式,直接写url和reverse反向解析
from django.http import HttpResponseRedirect
from django.core.urlresolvers import reverse
def addStu(request):
# 添加学生
if request.method == 'GET':
return render(request, 'addstu.html')
if request.method == 'POST':
name = request.POST.get('name')
tel = request.POST.get('tel')
stu = Student.objects.create(
s_name=name,
s_tel=tel
)
# 第一种方式
return HttpResponseRedirect('/stu/addinfo')
# url传参
return HttpResponseRedirect('/stu/addinfo/?stu_id='+str(stu.id))
# 方法参数传参
return HttpResponseRedirect('/stu/addinfo/'+str(stu.id))
# 第二种方式
return HttpResponseRedirect(
reverse('s:addinfo')
)
# 方法参数传参
return HttpResponseRedirect(
reverse('s:addinfo',
# args = [stu.id],
kwargs={'stu_id':stu.id})
)
reverse 的参数传递,有args 和kwargs,一个是列表一个是字典,区别为:args按照传参顺序获取参数,kwargs按照键名获取键值。
url传参在request域中的get中获取参数
方法传参需要在urls中添加
url(r'addstuinfo/(?P<stu_id>\d+)/', views.addStuInfo, name='addinfo'),
或url(r'addstuinfo/(\d+)/', views.addStuInfo, name='addinfo'),
前者必须在方法中填写此参数名,后者需按照参数顺序进行传参
如果表单中有文件或者图片要提交,需要在前端form表单添加属性
enctype="multipart/form-data"
后台通过request.FILES.get('image')获取
def addStuInfo(request, stu_id):
# 添加学生拓展信息
if request.method == 'GET':
return render(request, 'addstuinfo.html', {'stu_id':stu_id})
if request.method == 'POST':
stu_id = request.POST.get('stu_id')
addr = request.POST.get('addr')
image = request.FILES.get('image')
StudentInfo.objects.create(
i_addr=addr,
s_id=stu_id,
i_image=image
)
return HttpResponseRedirect('/stu/index/')
图片模型的定义
i_image = models.ImageField(upload_to='upload', null=True)
会在上传文件media路径下自动创建upload文件夹,图片文件就在这个文件夹下
需要安装pillow
pip install pillow
页面解析图片
<img src="/media/{{ stuinfo.i_image }}" width="100px" height="100px">
分页功能
导包
from django.core.paginator import Paginator
分页方法
def stuPage(request):
if request.method == 'GET':
page_id = request.GET.get('page_id', 1) # 获取当前第几页,默认第一页
stus = Student.objects.all()
paginator = Paginator(stus, 3) # 设置每页显示的数据
page = paginator.page(int(page_id)) # 获取第几页的数据
return render(request, 'index_page.html', {'stus': page})
页面显示
{% for stu in stus %}
姓名:{{ stu.s_name }}
电话:{{ stu.s_tel }}
地址:{{ stu.studentinfo.i_addr }}
<br>
{% endfor %}
<h4>一共{{ stus.paginator.num_pages }}页/一共{{ stus.paginator.count }}条数据</h4>
<h5>页码:
{% for i in stus.paginator.page_range %}
<a href="/stu/stupage/?page_id={{ i }}">{{ i }}</a>
{% endfor %}
</h5>
{% if stus.has_previous %}
<a href="/stu/stupage/?page_id={{ stus.previous_page_number }}">上一页</a>
{% endif %}
当前第{{ stus.number }}页
{% if stus.has_next %}
<a href="/stu/stupage/?page_id={{ stus.next_page_number }}">下一页</a>
{% endif %}
image.png
网友评论