Django基本篇-2

Django基本篇-2,第1张

概述一、多表 *** 作 现有的表包括导航表 Nav 和文章表 Articles,Articles 中的数据会保存对应的 nav_id,意思为,找到导航栏中某个菜单下的所有文章,通用的方法是先在 Nav 表中查到这个导航的 id,再根据其 id 在 Articles 表中找具有这个 nav_id 的文章。代码如下: 1 nav = models.Nav.objects.get(‘我的博客‘)2 resul 一、多表 *** 作

现有的表包括导航表 Nav 和文章表 Articles,Articles 中的数据会保存对应的 nav_ID,意思为,找到导航栏中某个菜单下的所有文章,通用的方法是先在 Nav 表中查到这个导航的 ID,再根据其 ID 在 Articles 表中找具有这个 nav_ID 的文章。代码如下:

1 nav = models.Nav.objects.get(我的博客)2 result = models.Article.objects.filter(nav=nav) #这里也可以写nav_ID=nav.ID

以上需要在两个表中查询的数据可以在一个表中实现

通过外键反向查询:

1 nav = models.Nav.objects.get(我的博客)2 result = nav.article_set.all()    #查询导航下面所有的文章
二、分页

目的:根据导航 ID 显示对应的文章

样式:前端带上参数 127.0.0.1:8000/index/?limit=10&page=2

1. 首先要获取到传过来的参数,即对前端的部分进行处理
1 limit = request.GET.get(limit,page_limit) #20为默认值2 page = request.GET.get(page,1)

此处的 page_limit 是配置在一个放常量的文件中,方便日后更改

另外,post 请求取参数的方式与 get 相同,即: demo = request.POST.get() 

2. 前端写到这里再看下分页的一些方法
 1 import django,os 2 from django.core.paginator import Paginator 3  4 # 分页怎么用 5 l = List(range(100)) 6 page_obj = Paginator(l,20) 7  8 print(page_obj.count) #总共多少数据 9 page1 = page_obj.get_page(1)10 print(List(page1)) #获取第几页的数据11 print(page_obj.num_pages) #总共分了几页12 print(page_obj.page_range) #分页范围13 print(page_obj.page_range[0])14 print(page_obj.page_range[-1])

以上用法为:

a. 给 Paginator 传两个参数,第一个是所有要分页的内容,第二个是每页的显示条数

b. 目前 page_obj 是一个含有所有分页信息的对象,它的用法有以上几种

c. 其中 page1 是具体到某一页的内容,它的用法如下:

 1 page1 = page_obj.get_page(1) 2 print(page1.number)   #当前的页码 3 page1.has_next() #是否有下一页 4 page1.has_other_pages() #是否有其他页 5 page1.has_prevIoUs() #是否有上一页 6 page1.next_page_number() #下一页的页码,如果没有下一页,则报错 7 page1.prevIoUs_page_number() #上一页的页码 8 page1.end_index()   #末页 9 page1.start_index() #首页10 obj = page1.paginator #获取分页的对象

根据以上的这些用法,我们可以对前端页面的页码和翻页展示进行 *** 作,首先,vIEws 中定义 index 上面展示了获取浏览器传过来的参数的方法(limit 和 page),然后再根据这两个参数拿到具体要显示的内容返回给前端,以下是整个 index 的内容:

def index(request): #格式要求写request    limit = request.GET.get(limit,page_limit) #默认值    page = request.GET.get(page,1)    # post请求获取参数    # request.POST.get()    # article = models.Article.objects.all()    page_obj = Paginator(models.Article.objects.all().order_by(ID),limit)    page_data = page_obj.get_page(page)    dic = {articles:page_data}    return render(request,index.HTML,dic)

获取到的 article 返回到 index 页面,这样就能在这个页面直接用这个数据。

然后在 index 页面对当前页面拿到的数据进行判断来展示翻页部分的功能,以下为翻页部分的逻辑,有个问题是 start_index 和 end_index 并不起作用,也就是首页喝末尾页用自带方法并未很好的实现

(调试过程中发现末尾页还好,首页内容不准,我改成了拿返回的第一个的方式,但是末页还不会写)用首尾页这个方法的问题表现在,点了之后在 URL 一栏中 limit 和 page 的信息是错的

 1 <ul class="pagination"> 2 {% if articles.has_other_pages %} 3 {#            <li><a href="/index/?limit={{ page_limit }}&page={{ articles.start_index }}">?</a></li>  start_index end_index不起作用#} 4     <li><a href="/index/?limit={{ page_limit }}&page={{ articles.paginator.page_range.0 }}">?</a></li> 5 {% endif %} 6  7 {% if articles.has_prevIoUs %} 8     <li><a href="/index/?limit={{ page_limit }}&page={{ articles.prevIoUs_page_number }}"><?</a></li> 9 {% endif %}10 11     {% for num in articles.paginator.page_range %}12         {% if articles.number == num %}13             <li><a class="active" href="/index/?limit={{ page_limit }}&page={{ num }}">{{ num }}</a></li>14         {% else %}15             <li><a href="/index/?limit={{ page_limit }}&page={{ num }}">{{ num }}</a></li>16         {% endif %}17     {% endfor %}18 19 {% if articles.has_next %}20     <li><a href="/index/?limit={{ page_limit }}&page={{ articles.next_page_number }}">></a></li>21 {% endif %}22 23 {% if articles.has_other_pages %}24     <li><a href="/index/?limit={{ page_limit }}&page={{ articles.end_index }}">?</a></li>25 {% endif %}26 </ul>
 三、Django 后台管理

通过 127.0.0.1:8000/admin 即可访问,为后台添加管理员的 *** 作:python manage.py createsuperuser

之后的用户可以在后台直接创建。

1.配表

Django 创建的工程中自带的一些东西就包含后台,相关内容在 admin.py 中,而初次打开后台的时候并不会把我们现有的表展示出来,这时候需要在前面提到的 python 文件中配置一下:

 1 from django.contrib import admin 2 from . import models 3 # Register your models here. 4  5 # admin.site.register(models.Nav) #与下方的class二选一 6 # admin.site.register(models.Article) 7  8  9 class Navadmin(admin.Modeladmin):10     List_display = [ID,name,create_time]11 12 class Articleadmin(admin.Modeladmin):13     List_display = [ID,Title,img,create_time] #显示几列14     search_fIElds = [Title,content]15     List_per_page = 516 17 class Studentadmin(admin.Modeladmin):18     List_display = [name,phone,money]19 20 admin.site.register(models.Article,Articleadmin)21 admin.site.register(models.Nav,Navadmin)22 admin.site.register(models.Student,Studentadmin)

以上配置包含了显示表中的哪些列,配好了表之后,就可以在后台很方便地对数据库表进行 *** 作啦。

但是随之而来的还有另外一个问题,就是在后台这样的前端界面输入的数据其实是没有经过校验的,如何保证数据填写符合我们的要求,就需要在前端增加校验。

四、前端数据的校验

之前学 Python 的时候,要做这件事可能就是对挨个的数据进行判断,如先非空检验,再各个字段去校验,这里的要简单许多,先简单罗列一下。

 1 class StudentForm(forms.Form): 2     name = forms.CharFIEld(min_length=2,max_length=10,required=True) #required=True表示必填,默认必填 3     phone = forms.CharFIEld(min_length=11,max_length=11) 4     money = forms.floatFIEld(required=False,default=0,null=True) 5 #     自定义函数校验是否字段重复 6     def clean_phone(self): 7         ‘‘‘钩子‘‘‘ 8         phone = self.cleaned_data[phone] 9         if models.Student.objects.filter(phone=phone):10             return self.errors.add(手机号错误,手机号已经存在)11         return phone12 13 14 def student(request):15     stu_form = StudentForm(request.POST)16     if stu_form.is_valID():17         models.Student.objects.create(**stu_form.cleaned_data)18         data = {"msg":"成功"}19     else:20         data = {"msg":"检验失败"}21     return httpResponse(Json.dumps(data,ensure_ascii=False))

理解上还需要再回看视频。

五、同一页面不同请求方法访问时的处理(前端向后端写数据)

以在后台添加文章为例,我们需要两个 URL,一个用来展示添加文章的页面,另一个用来向后端发送请求添加数据。

这时候可以写成两个 URL,但也可以写成一个,只需要在定义的时候将请求方法区分开即可。

 1 def add_article(request): 2     if request.method == GET: 3         return render(request,add.HTML) 4     else: 5         Title = request.POST.get(Title) 6         content = request.POST.get(content) 7         nav_ID = request.POST.get(nav_ID) 8         img = request.fileS.get(img) 9         models.Article.objects.create(Title=Title,content=content,nav_ID=nav_ID,img=img)10         return httpResponseRedirect(/index)

正常访问 add 页面时,是 get 请求,展示的是添加文章数据的页面,在 add.HTML 中,我们定义了向后端发送请求为 post 方法。这样就可以实现各自的功能了。

不过这里 add.htnl 中写的是 form 表单的形式,周六有时间自己要尝试用 AJAX 写一下。

 

文章待完善:

后台校验数据的方法理解(四) 前端向后端发送请求使用 AJAX 重写(五) 总结

以上是内存溢出为你收集整理的Django基本篇-2全部内容,希望文章能够帮你解决Django基本篇-2所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1190438.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-03
下一篇 2022-06-03

发表评论

登录后才能评论

评论列表(0条)

保存