美文网首页django
django三、view与路由 url 解析、分页功能

django三、view与路由 url 解析、分页功能

作者: Jason_c8d4 | 来源:发表于2018-05-17 21:11 被阅读0次

路由与反向解析:

在项目工程目录下的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

相关文章

网友评论

    本文标题:django三、view与路由 url 解析、分页功能

    本文链接:https://www.haomeiwen.com/subject/lotmdftx.html