列表和詳細資訊檢視
模板檢視適用於靜態頁面,你可以將它們用於 get_context_data
的所有內容,但它幾乎比使用函式作為檢視更好。
輸入 ListView 和 DetailView
應用程式/ 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>
– {{ 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>
和以前一樣,上下文用名為 object
和 pokemon
的模型物件填充,第二個是從模型名稱派生的。
應用程式/ 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 中。