3、Django學習:使用模板顯示內容

模板建立好以後,天然須要用來顯示內容了。咱們要達到目的訪問127.0.0.1:8000/article能夠顯示出文章列表,點擊文章標題能夠連接到具體文章頁面,訪問127.0.0.1:8000/article/1,127.0.0.1:8000/article/2....能夠顯示出標題,內容。html

1、查看article app的數據庫遷移文件

demo article migrations 0001_initial.pypython

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,並且是主鍵,做爲惟一標識。數據庫

2、在article appviews.py文件中編寫處理方法

demo article views.pydjango

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)

3、在總路由urls.py文件裏添加新的url

demo 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')
]

4、啓動服務,查看運行狀況

命令python manage.py runserver能夠看到如咱們預期同樣輸出告終果前後端分離

5、導入app模型到article appviews.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))

6、再次啓動服務

啓動服務,訪問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之類不存在的網頁時還會報錯,須要作異常處理

7、代碼的優化

  • 訪問不存在的頁面時候進行異常處理

當訪問的頁面不存在時顯示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)

8、編寫文章列表

爲了讓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_detailarticle/<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>

9、路由優化

一個項目是由多個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能夠獲得一樣的結果。
相關文章
相關標籤/搜索