列表和详细信息视图

模板视图适用于静态页面,你可以将它们用于 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 中。