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