首页>>后端>>Python->djangoreverse怎么导入?

djangoreverse怎么导入?

时间:2023-12-07 本站 点击:0

导读:很多朋友问到关于djangoreverse怎么导入的相关问题,本文首席CTO笔记就来为大家做个详细解答,供大家参考,希望对大家有所帮助!一起来看看吧!

Django页面跳转

实例:通过学生所在的班级编号,获取这个班级的信息

a.在html页面的a链接地址中用?添加参数,需要在地址中设置参数名和参数值

b.url中地址不需要设置参数

c.函数中不需要传入此参数,在函数中用GET.get('参数名')的方法获取

a.在a链接路径末尾直接加上参数

b.给url中的地址加上参数匹配,此处暂时忽略下方的name参数

c.函数中需要传入此参数不需要再通过GET.get()获取,可以直接使用

在页面点击登陆,跳转登陆页面,在url中写法如下:

主目录urls文件中配置app的url

app目录urls文件配置login路径

a.正则表达式

b.namespace:name

a.用reverse传参数

注意:reverse中的地址必须用 namespace:name 形式

b.url中的地址必须指定参数名称

a.不需要传参数,可直接用HttpresponseRedirect

b.url地址不需要传参数

Django 报错Reverse for '...' with arguments'()' ...

当你配置了url如图所示时,在前端页面中所有要跳转到OrgHomeView所渲染的页面中时,都要传入参数

django新手...如何吧一个view里面的列表变量传到另外一个view里面去?

我们看这里

url(r'^(?Pquery_result\[.*\])/query_book_result/$', views.query_book_result, name='query_book_result'),

这里是捕获url里的参数,url本身是当做字符串来处理的,那么捕获的进来的参数,无疑一定是字符串

你可以稍作尝试,在query_book_result函数中加一行

 if isinstance(query_result,str):query_result='query_result is string here.'

用来验证

这里可以稍微处理一下,把字符串变成列表:

query_result = query_result.replace('[','').replace(']','').split(',')

但是实际上列表里的内容依然是字符串,不是key value的形式,但是单就输出来讲,循环输出是没问题了

第10节、案例-客户关系管理系统之增删改查笔记

第10节、案例-客户关系管理系统之增删改查笔记

一、建立模型

1、导入模型

fromdjango.dbimportmodels

2、创建学生表

classStudent(models.Model):# 学生表

name=models.CharField(max_length=20)

age=models.SmallIntegerField()

sex=models.SmallIntegerField(default=1)

qq=models.CharField(max_length=20,unique=True)

phone=models.CharField(max_length=20,unique=True)

c_time=models.DateTimeField(verbose_name='创建时间',auto_now_add=True)

e_time=models.DateTimeField(verbose_name='修改时间',auto_now=True)

grade=models.ForeignKey('Grade',on_delete=models.SET_NULL,null=True)

is_delete=models.BooleanField(default=False)# 一般实际开发过程中,我们不会直接删除数据,而是给数据加上is_delete字段,来标记数据的状态。

def__str__(self):

return'%s-%s-%s'%(self.name,self.age,self.sex)

3、创建学生详情表

classStudentDetail(models.Model):#学生详情表

num=models.CharField('身份证',max_length=40,unique=True)

college=models.CharField('毕业学校',max_length=20,default='')

student=models.OneToOneField('Student',on_delete=models.CASCADE,related_name='detail')

def__str__(self):

return'%s-%s'%(self.num,self.college)

4、创建班级表

classGrade(models.Model):# 班级表

name=models.CharField('班级名称',max_length=20)

num=models.CharField('班期',max_length=20)

def__str__(self):

return'%s-%s'%(self.name,self.num)

5、创建课程表

classCourse(models.Model):# 课程表

name=models.CharField('课程名称',max_length=20)

student=models.ManyToManyField('Student',through='Enroll')

def__str__(self):

return'%s'%self.name

6、创建学生表与课程表的中间表

classEnroll(models.Model):# 课程与学生多对多中间表

student=models.ForeignKey('Student',on_delete=models.CASCADE)

course=models.ForeignKey('Course',on_delete=models.CASCADE)

pay=models.FloatField('缴费金额',default=0)

c_time=models.DateTimeField(verbose_name='创建时间',auto_now_add=True)

def__str__(self):

return'%s'%self.pay

##

二、增删改查功能实现

1、index页面视图函数

fromdjango.shortcutsimportrender,redirect,reverse

fromdjango.httpimportHttpResponse

fromstudent.modelsimportStudent,Grade,StudentDetail

fromdjango.db.modelsimportQ

fromdjango.core.paginatorimportPaginator

# Create your views here.

defindex(request):

section='学生列表'

search=request.POST.get('search','').strip()# 接收从html的form表单传过来的参数

ifsearch:

ifsearch.isdigit():# 如果是数值类型则

sts=Student.objects.filter(Q(qq=search)|Q(phone=search),is_delete=False)# 用qq和phone去匹配

else:# 如果是字符型

sts=Student.objects.filter(name=search,is_delete=False)# 则和名字匹配

else:# search都没有匹配到则查询所有学生

sts=Student.objects.filter(is_delete=False)

sts=sts.order_by('-c_time')# 排序

returnrender(request,'student/index.html',context={

'sts':sts,

'section':section,

'search':search,

    })

2、学生删除页视图

defstudent_delete(request,pk):

student=Student.objects.get(pk=pk)# 查询id为pk的学生

student.is_delete=True# 将is_delete标记为True,

student.save()# 保存

returnredirect(reverse('student:index'))

3、学生详情页视图

defstudent_detail(request,pk):

section='学生详情'

grades=Grade.objects.all()# 查询所有班级

sts=Student.objects.get(pk=pk)# 获取当前id为pk的学生信息

grade=Grade.objects.get(pk=sts.grade_id)# 查询指定学生的班级

detail=StudentDetail.objects.get(student=sts)# 查询指定学生的详情

returnrender(request,'student/student_detail.html',context={

'section':section,

'grades':grades,

'sts':sts,

'grade':grade,

'detail':detail,

    })

4、添加页视图函数

defstudent_add(request):

section='添加学生信息'

grades=Grade.objects.all()# 获取所有的班级

ifrequest.method=='GET':

returnrender(request,'student/student_detail.html',context={

'section':section,

'grades':grades,

        })

ifrequest.method=='POST':

# 获取班级信息

grade_id=request.POST.get('grade')# 获取前端传回来的grade.id

try:

grade=Grade.objects.get(pk=grade_id)

except:

grade=None

# 获取学生信息姓名、年龄、性别、qq、电话

data= {

'name':request.POST.get('name'),

'age':request.POST.get('age'),

'sex':request.POST.get('sex'),

'qq':request.POST.get('qq'),

'phone':request.POST.get('phone'),

'grade':grade#表关联,在student中

        }

student=Student.objects.create(**data)

# 获取学生详情信息

StudentDetail.objects.create(

num=request.POST.get('num'),

college=request.POST.get('college'),

student=student# 表关联

        )

returnredirect(reverse('student:index'))

5、修改学生信息页视图函数

defstudent_edit(request,pk):

section='修改学生信息'

sts=Student.objects.get(pk=pk)# 查询id为pk的学生

grade=Grade.objects.get(pk=sts.grade_id)# 查询指定学生的班级

detail=StudentDetail.objects.get(student=sts)# 查询指定学生的详情

ifrequest.method=='GET':

returnrender(request,'student/student_detail.html',context={

'section':section,

'sts':sts,

'grade':grade,

'detail':detail,

        })

ifrequest.method=='POST':

# 获取班级信息

grade_id=request.POST.get('grade')# 获取前端传回来的grade

try:

grade=Grade.objects.get(pk=grade_id)# 获取学生的班级

except:

grade=None

# 获取学生信息并修改

student=Student.objects.get(pk=pk)

student.name=request.POST.get('name')

student.age=request.POST.get('age')

student.sex=request.POST.get('sex')

student.qq=request.POST.get('qq')

student.phone=request.POST.get('phone')

student.grade=grade# 表关联

# 获取学生详情

try:

detail=student.detail# 表关联,关联表在student

except:

detail=StudentDetail()

detail.student=student# 表关联,关联表在detail

detail.num=request.POST.get('num')

detail.college=request.POST.get('college')

detail.save()# 保存

student.save()# 保存

returnredirect(reverse('student:index'))

三、分页功能实现

1、对主页分页方法一

1.1主页的视图函数

defindex(request):

section='学生列表'

search=request.POST.get('search','').strip()# 接收从html的form表单传过来的参数

ifsearch:

ifsearch.isdigit():# 如果是数值类型则

sts=Student.objects.filter(Q(qq=search)|Q(phone=search),is_delete=False)# 用qq和phone去匹配

else:# 如果是字符型

sts=Student.objects.filter(name=search,is_delete=False)# 则和名字匹配

else:# search都没有匹配到则查询所有学生

sts=Student.objects.filter(is_delete=False)

sts=sts.order_by('-c_time')# 排序

# 分页

total_num=sts.count()# 总的数据量

per_page=int(request.GET.get('per_page',5))# 每页默认条数为5

page=int(request.GET.get('page',1))# 当前页面默认为第1页

p=Paginator(sts,per_page,allow_empty_first_page=True)

sts=p.get_page(page)# 每页显示的数据

total_page=p.num_pages# 总的页面数

page_list=p.page_range# 获取页面范围

returnrender(request,'student/index.html',context={

'sts':sts,

'section':section,

'search':search,

'total_num':total_num,

'total_page':total_page,

'page':page,

'per_page':per_page,

'page_list':page_list,

    })

1.2、html中页码的设置

navaria-label="Page navigation"style="display: inline-block"

ulclass="pagination"

li{%ifpage==1%}class="disabled"{%endif%}

ahref="{% if page 1 %}{% url 'student:index' %}?page={{ page|add:-1 }}per_page={{ per_page }}{% else %}{% url 'student:index' %}?page={{ page }}per_page={{ per_page }}{% endif %}"aria-label="Previous"

spanaria-hidden="true"上一页/span

/a

/li

            {% for i in page_list %}

li{%ifpage==i%}class="active"{%endif%}ahref="{{ request.path }}?page={{ i }}per_page={{ per_page }}"{{ i }}/a/li

            {% endfor %}

li{%ifpage==total_page%}class="disabled"{%endif%}

ahref="{% if page total_page %}{% url 'student:index' %}?page={{ page|add:1 }}per_page={{ per_page }}{% else %}{% url 'student:index' %}?page={{ page }}per_page={{ per_page }}{% endif %}"aria-label="Next"

spanaria-hidden="true"下一页/span

/a

/li

/ul

/nav

!-- Single button --

divclass="btn-group"style="display: inline-block; margin-top: -68px"

buttontype="button"class="btn btn-default dropdown-toggle"data-toggle="dropdown"aria-haspopup="true"aria-expanded="false"

{{ per_page }}条/页spanclass="caret"/span

/button

ulclass="dropdown-menu"

liahref="{% url 'student:index' %}?page={{ page}}per_page= 5 "5条/页/a/li

liahref="{% url 'student:index' %}?page={{ page}}per_page= 10 "10条/页/a/li

liahref="{% url 'student:index' %}?page={{ page}}per_page= 15 "15条/页/a/li

liahref="{% url 'student:index' %}?page={{ page}}per_page= 20 "20条/页/a/li

/ul

/div

2、对主页分页方法二(利用包含标签)

2.1、index中的视图函数

defindex(request):

section='学生列表'

search=request.POST.get('search','').strip()# 接收从html的form表单传过来的参数

ifsearch:

ifsearch.isdigit():# 如果是数值类型则

sts=Student.objects.filter(Q(qq=search)|Q(phone=search),is_delete=False)# 用qq和phone去匹配

else:# 如果是字符型

sts=Student.objects.filter(name=search,is_delete=False)# 则和名字匹配

else:# search都没有匹配到则查询所有学生

sts=Student.objects.filter(is_delete=False)

sts=sts.order_by('-c_time')# 排序

# 分页

total_num=sts.count()# 总的数据量

per_page=int(request.GET.get('per_page',5))# 每页默认条数为5

page=int(request.GET.get('page',1))# 当前页面默认为第1页

p=Paginator(sts,per_page,allow_empty_first_page=True)

sts=p.get_page(page)# 每页显示的数据

total_page=p.num_pages# 总的页面数

page_list=p.page_range# 获取页面范围

returnrender(request,'student/index.html',context={

'sts':sts,

'section':section,

'search':search,

'total_num':total_num,

'total_page':total_page,

'page':page,

'per_page':per_page,

'page_list':page_list,

    })

2.2、在templatetags文件夹中创建student_custormer_tags.py

#!/usr/bin/python

# -*- coding: utf-8 -*-

# author:cyb time:2019/5/25 23:34

fromdjangoimporttemplate

register=template.Library()

@register.inclusion_tag('student/paginitor.html',takes_context=True)

defpagination_html(context):# 谁引用就导入谁的context

total_page=context['total_page']# 总的页面数

page=context['page']# 显示第几页的数据

page_list=context['page_list']# 页面范围

per_page=context['per_page']# 每页条数

'''

    假设现在total_page = 6

    两种页码控制方法:

    当num = 1 # 当前页面左右各有几页

    上一页  1  2  3 下一页

    上一页  4  5  6 下一页

    上一页    1  2 下一页

    上一页  5  6    下一页

    当num = 2 # 当前页面左右各有几页

    上一页        1  2  3 下一页

    上一页    1  2  3  4 下一页

    上一页  1  2  3  4  5 下一页

    上一页  2  3  4  5  6 下一页

    上一页  4  5  6      下一页

    '''

page_list= []

num=2

# 1、左边 + 当前页显示的页码列表

# 1.1、左边不够显示时,页码范围1到当前页

ifpage-num=0:

foriinrange(1,page+1):

page_list.append(i)

else:# 左边够显示时,页码范围page-num到当前页

foriinrange(page-num,page+1):

page_list.append(i)

# 2、右边 + 当前页显示的页码列表

# 2.1、右边不够显示时,页码范围当前页到total_page

ifpage+num=total_page:

foriinrange(page+1,total_page+1):

page_list.append(i)

# 2.2、右边够显示时,页码范围(当前页+1)到(当前页+num)

else:

foriinrange(page+1,page+num):

page_list.append(i)

return{

'total_page':total_page,

'page':page,

'page_list':page_list,

'per_page':per_page

    }

2.3、在app中新建一个包含标签渲染模板paginitor.html

ulclass="pagination"

li{%ifpage==1%}class="disabled"{%endif%}

a{%ifpage1 %} href="{% url 'student:index' %}?page={{ page|add:'-1' }}per_page={{ per_page }}{% endif %}" aria-label="Previous"

spanaria-hidden="true"«/span

/a

/li

    {% for page_num in page_list %}

li{%ifpage_num==page%}class="active"{%endif%}ahref="{{ request.path }}?page={{ page_num }}per_page={{ per_page }}"{{ page_num }}/a/li

    {% endfor %}

li{%ifpage==total_page%}class="disabled"{%endif%}

a{%ifpage total_page %} href="{{ request.path }}?page={{ page|add:'1' }}per_page={{ per_page }}{% endif %}" aria-label="Next"

spanaria-hidden="true"»/span

/a

/li

/ul

2.4、在index.html中导入后在对应位置引用

1、导入:{% load student_customer_tags %}

2、引用:

nav aria-label="Page navigation" style="display: inline-block"

        {% pagination_html %}

/nav

四、页面展示

1、主页展示

2、添加页展示

3、修改页展示

Django框架中path及re_path中name参数的使用和模板渲染(八)

name参数可以给一个匹配的url地址取名字,一般用于模板,也可以使用reverse进行页面重定向。

1、为APP中的books里面的urls.py(给url取个名字)

2、为APP中books里面的views.py(redirect是重定向,reverse是将url的name解析成url本身的函数)

1、 name参数可以给这个url取一个合适的名字。通过给url取名字,以后在view或者模板中使用这个URL,就只需要通过这个名字就可以了。这样做的原因是防止url的规则更改,会导致其他地方用了这个url的地方都需要更改,但是如果取名字了,就不要做任何改动了。

2、注意事项:

1、模板放在哪?

2、在项目主目录setting.py中进行模板路径配置; 将我们的设置好的存放html模板的templates目录路径添加到DIRS中。

注意:reverse方法里面也可以有kwargs参数,直接将参数传给被reverse解析后要跳转的url路径中的捕获参数,来达到传参的效果。

django 怎么跳转和重定向

跳转和重定向很常见的场景就是登录和注销后返回到当前页面。给你个登录和注销的例子。

比如用户正在浏览一篇文章,发现下载该文章的附件需要登录才能进行,这时候点击登陆链接转入登陆页面,输入用户名密码登陆成功以后,会自动转回原来的那篇文章所在的页面。(目前很多网站采用ajax方法弹出对话框登陆,效果更好一些)

怎么做呢?下面说的是django的实现,但是大多数的web framework都可以这么做。

注销操作:

因为不需要单独的注销页面,相对简单,利用HTTP_REFERER,Django的注销页面这样写就行:

def logout_user(request):

logout(request)

return HttpResponseRedirect(request.META.get('HTTP_REFERER', '/'))

登录操作:

登陆操作相对复杂,因为一般都有单独的登陆页面,如果登陆成功再取HTTP_REFERER就是登陆页面自己的url,而不是之前的那个页面。

可以利用django的session,在转入登陆的时候,用的是页面的get请求,这时候在session中记录HTTP_REFERER,用户输入用户名密码进行登陆的时候(Post请求),从session中取出即可:

def login_user(request):

if request.method == 'GET':

#记住来源的url,如果没有则设置为首页('/')

request.session['login_from'] = request.META.get('HTTP_REFERER', '/')

#TODO:显示登陆页面,blablabla

elif request.method == 'POST':

#TODO: 用户登录操作,blablabla

#重定向到来源的url

return HttpResponseRedirect(request.session['login_from'])

最后的重定向,有时候需要用户感觉到被重定向回去了,就写个简单的页面告诉用户两秒以后跳转,然后改改相应的login代码就行:

p两秒钟后转入如下链接,如果长时间没有响应请直接点击:/p

pa href="{{ refresh_url }}"{{ refresh_url }}/a/p

meta http-equiv="refresh" content="2;url={{ refresh_url }}"

结语:以上就是首席CTO笔记为大家整理的关于djangoreverse怎么导入的全部内容了,感谢您花时间阅读本站内容,希望对您有所帮助,更多关于djangoreverse怎么导入的相关内容别忘了在本站进行查找喔。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:/Python/18468.html