列表和詳細資訊檢視

模板檢視適用於靜態頁面,你可以將它們用於 get_context_data 的所有內容,但它幾乎比使用函式作為檢視更好。

輸入 ListViewDetailView

應用程式/ models.py

from django.db import models

class Pokemon(models.Model):
    name = models.CharField(max_length=24)
    species = models.CharField(max_length=48)
    slug = models.CharField(max_length=48)

應用程式/ views.py

from django.views.generic import ListView, DetailView
from .models import Pokemon

class PokedexView(ListView):
    """ Provide a list of Pokemon objects """
    model = Pokemon
    paginate_by = 25

class PokemonView(DetailView):
    model = Pokemon

這就是生成檢視所需的全部內容,其中列出了模型的所有物件和單個專案的檢視。該列表甚至是分頁的。如果你想要特定的東西,你可以提供 template_name。預設情況下,它是從模型名稱生成的。

應用程式/模板/應用/ pokemon_list.html

<!DOCTYPE html>
<title>Pokedex</title>
<ul>{% for pokemon in pokemon_list %}
    <li><a href="{% url "app:pokemon" pokemon.pk %}">{{ pokemon.name }}</a>
        &ndash; {{ pokemon.species }}
</ul>

上下文中填充了兩個名稱 object_list 下的物件列表,以及來自模型名稱的第二個名稱,此處為 pokemon_list。如果你對列表進行了分頁,則還必須處理下一個和上一個連結。該分頁程式物件可以與幫助,它在上下文資料可用了。

應用程式/模板/應用/ pokemon_detail.html

<!DOCTYPE html>
<title>Pokemon {{ pokemon.name }}</title>
<h1>{{ pokemon.name }}</h1>
<h2>{{ pokemon.species }} </h2>

和以前一樣,上下文用名為 objectpokemon 的模型物件填充,第二個是從模型名稱派生的。

應用程式/ urls.py

from django.conf.urls import url
from . import views

app_name = 'app'
urlpatterns = [
    url(r'^pokemon/$', views.PokedexView.as_view(), name='pokedex'),
    url(r'^pokemon/(?P<pk>\d+)/$', views.PokemonView.as_view(), name='pokemon'),
]

在此程式碼段中,詳細資訊檢視的網址是使用主鍵構建的。也可以使用 slug 作為引數。這樣可以更容易記住更好看的網址。但是,它需要在模型中存在名為 slug 的欄位。

url(r'^pokemon/(?P<slug>[A-Za-z0-9_-]+)/$', views.PokemonView.as_view(), name='pokemon'),

如果不存在名為 slug 的欄位,則可以使用 DetailView 中的 slug_field 設定指向其他欄位。

對於分頁,請使用頁面獲取引數或將頁面直接放在 URL 中。