Django基本篇-2

1、多表操做

現有的表包括導航表 Nav 和文章表 Articles,Articles 中的數據會保存對應的 nav_id,意思爲,找到導航欄中某個菜單下的全部文章,通用的方法是先在 Nav 表中查到這個導航的 id,再根據其 id 在 Articles 表中找具備這個 nav_id 的文章。代碼以下:html

1 nav = models.Nav.objects.get('個人博客')
2 result = models.Article.objects.filter(nav=nav) #這裏也能夠寫nav_id=nav.id

以上須要在兩個表中查詢的數據能夠在一個表中實現前端

經過外鍵反向查詢:python

1 nav = models.Nav.objects.get('個人博客')
2 result = nav.article_set.all()    #查詢導航下面全部的文章

2、分頁

目的:根據導航 id 顯示對應的文章ajax

樣式:前端帶上參數 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 是配置在一個放常量的文件中,方便往後更改django

另外,post 請求取參數的方式與 get 相同,即: demo = request.POST.get() json

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>

 3、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 = 5
16 
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)

以上配置包含了顯示錶中的哪些列,配好了表以後,就能夠在後臺很方便地對數據庫表進行操做啦。

可是隨之而來的還有另一個問題,就是在後臺這樣的前端界面輸入的數據實際上是沒有通過校驗的,如何保證數據填寫符合咱們的要求,就須要在前端增長校驗。

4、前端數據的校驗

以前學 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 phone
12 
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))

理解上還須要再回看視頻。

5、同一頁面不一樣請求方法訪問時的處理(前端向後端寫數據)

以在後臺添加文章爲例,咱們須要兩個 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 重寫(五)
相關文章
相關標籤/搜索