模板建立好以後,天然須要用來顯示內容了。咱們要達到目的訪問127.0.0.1:8000/article能夠顯示出文章列表,點擊文章標題能夠連接到具體文章頁面,訪問127.0.0.1:8000/article/1,127.0.0.1:8000/article/2....能夠顯示出標題,內容。html
demo article migrations 0001_initial.py
python
fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('title', models.CharField(max_length=40)), ('content', models.TextField()), ],
能夠看到裏面除了有咱們建立的title
,content
字段外,還有一個自動建立字段id
,並且是主鍵,做爲惟一標識。數據庫
article app
的views.py
文件中編寫處理方法demo article views.py
django
from django.shortcuts import render from django.http import HttpResponse # Create your views here. def article_detail(request, article_id): return HttpResponse("文章ID %s" % article_id)
urls.py
文件裏添加新的urldemo urls.py
後端
導入
article_detail
方法用於顯示具體頁面,增長一個新的path用於處理article/id
頁面,<int:article_id>
表明傳入的是int類型,name='article_detail'
是別名app
from django.contrib import admin from django.urls import path from .views import say_hello from article.views import article_detail urlpatterns = [ path('admin/', admin.site.urls), path('', say_hello), path('article/<int:article_id>',article_detail, name='article_detail') ]
命令python manage.py runserver
能夠看到如咱們預期同樣輸出告終果前後端分離
article app
的views.py
文件article views.py
優化
爲了讓app模型中的文章像上面同樣顯示出來,須要導入模型,並獲取到模型的一個實例對象。url
from django.shorcuts import render from django.http import HttpResponse from .models import Article # Create your views here. def article_detail(request, article_id): # 經過主鍵id字段獲取模型的實例對象 article = Article.objects.get(id=article_id) return HttpResponse("文章ID:%s 文章標題:%s 文章內容:%s" % (article.id, article.title, article.content))
啓動服務,訪問127.0.0.1:8000/article/一、127.0.0.1:8000/article/2....spa
這樣輸出結果不美觀,咱們能夠進行優化,加入換行。
在article views.py
中加入html
代碼
from django.contrib import render from django.http import HttpResponse from .models import Article # Create your views here. def article_detial(request, article_id): article = Article.objects.get(id=article_id) return HttpResponse("文章ID:%s<br>文章標題:%s<br>文章內容:%s" % (article.id, article.title, article.content))
刷新頁面後顯示
可是這種先後端耦合在一塊兒的作法顯然不合適,之後要修改的時候會特別麻煩。另外當訪問
127.0.0.1:8000/article/5
之類不存在的網頁時還會報錯,須要作異常處理
當訪問的頁面不存在時顯示404
article views.py
from django.contrib import render from django.http import HttpResponse,Http404 from .models import Article # Create your views here. def article_detail(request, article_id): try: article = Article.objects.get(id=article_id) except Article.DoesNotExist: raise Http404("Not exist") return HttpResponse("文章ID:%s<br>文章標題:%s<br>文章內容:%s" % (article.id, article.title, article.content))
再次訪問127.0.0.1:8000/article/5
,能夠獲得404顯示頁面
還可進一步優化以下
get_object_or_404
自動作了異常處理,傳入的參數第一個個爲模型,第二個爲選擇的條件
from django.contrib import render,get_object_or_404 from django.http import HttpResponse from .models import Article # Create your views here. def article_detail(request, article_id): # pk主鍵的縮寫 article = get_object_or_404(Article, pk=article_id) return HttpResponse("文章ID:%s<br>文章標題:%s<br>文章內容:%s" % (article.id, article.title, article.content))
再次訪問127.0.0.1:8000/article/5
一、在article
文件夾下面建立一個文件夾templates
,在templates
文件夾裏面建立一個article_detail.html
文件。
二、修改article views.py
文件
from django.contrib import render,get_object_or_404 from django.http import HttpResponse from .models import Article # Create your views here. def article_detail(request, article_id): article = get_object_or_404(Article, pk=article_id) context = {} context['article_obj'] = article # render第一個參數爲request,第二個參數爲html模板,第三個參數爲鍵值爲article對象的字典 return render(request, 'article_detail.html', context)
三、修改article templates article_detail.html
文件
<html> <head> </head> <body> <h2> {{article_obj.title}} </h2> <hr> <p> {{article_obj.content}} </p> </body> </html>
四、再次訪問127.0.0.1:8000/article/1
能夠正常顯示,也完成了先後端分離
ps:除了render外,還有一個render_to_response也能用於返回response,不一樣的是,render_to_response只須要傳入後兩個參數
# return render(request, 'article_detail.html', context) # 如下代碼能夠獲得相同的結果 return render_to_response('article_detail.html', context)
爲了讓127.0.0.1:8000/article顯示出文章列表,一樣須要編寫路由文件、html模板文件以及與處理方法文件。
在templates
文件夾下面新建一個article_list.html
文件
編寫article views.py
文件
from django.contrib import render,get_object_or_404,render_to_response from django.http import HttpResponse from .models import Article # Create your views here. def article_detail(request, article_id): article = get_object_or_404(Article, pk=article_id) context = {} context['article_obj'] = article return render_to_response('article_detail.html', context) def article_list(request): # 使用all()獲取全部列表 article_list = Article.objects.all() context = {} context['article_list_obj'] = article_list return render_to_response('article_list.html', context)
在總路由添加路徑和處理方法,demo urls.py
from django.contrib import admin from django.urls import path from .views import say_hello from articles.views import article_detail,article_list urlpatterns = [ path('admin/', admin.site.urls), path('', say_hello), path('article/<int:article_id>', article_detail, name='article_detail'), path('articl/', article_list, name='article_list') ]
修改模板文件templates article_list.html
<html> <head> </head> <body> <h2>{{article_list_obj}}</h2> </body> </html>
127.0.0.1:8000/article
頁面,獲得的是一個QuerySet類型的列表template article_list.html
中修改成for
循環遍歷出值<html> <head> </head> <body> {% for article in article_list_obj %} <p>{{ article.title }}</p> {% endfor %} </body> </html>
刷新127.0.0.1:8000/article
頁面
咱們須要讓標題變爲一個可連接的,點擊標題能夠直接進入正文。
進一步對templates article_list.html
進行修改。
增長一個href屬性用於連接
<html> <head> </head> <body> {% for article in article_list_obj %} <a href="/article/{{article.pk}}">{{article.title}}</a> {% endfor %} </body> </html>
此時再次刷新127.0.0.1:8000/article
能夠看到文章列表能夠點擊,並且能夠連接到文章正文了。
還可使用別名對代碼進行進一步優化
template article_list.html
article_detail
是article/<int:article_id>
的別名,以前定義在demo urls.py
文件中。
<html> <head> </head> <body> {% for article in article_list_obj %} <a href="{% url 'article_detail' article.pk %}">{{article.title}}</a> {% endfor %} </body> </html>
一個項目是由多個app組成的,若是全部app的路由都設置到
demo urls.py
文件中的話,會致使文件愈來愈複雜,之後修改也比較困難。因此須要對路由進行優化,讓各個app處理本身的路由。
demo article
文件夾下面新建一個urls.py
文件,編寫以下from django.urls import path from . import views urlpatterns = [ path('<int:article_id>', views.article_details, name='article_details'), path('', views.article_list, name='article_list') ]
include
將子路由與總路由關聯起來,demo urls.py
from django.contrib import admin from django.urls import path,include from .views import say_hello urlpatterns = [ path('admin/', admin.site.urls), path('', say_hello), path('article', include('article.urls')) ]
localhost:8000/article
能夠獲得一樣的結果。