按照执行顺序排下来
点击超链接
{%for post in post_list %}
<article class="post post-1">
<header class="entry-header">
<h1 class="entry-title">
<a href="{{ post.make_post_url }}">{{ post.title }}</a>
</h1>
</header>
</article>
{% endfor %}
- 根据页面 URL 匹配到视图,视图响应出该模板。就是上图代码。
- psot_list 是从视图中传来(render 函数的 context 参数)
- 而视图又是从数据库中得到数据
post_list = Post.objects.all()
。
构造 URL
post 对象调用了构造 URL 的方法 make_post_url
。
该方法的定义在 Post 模型中。
reverse 函数根据视图来找到 URL 模式,再传入参数构造 URL。
app\models.py
from django.urls import reverse
class Post(models.Model):
def make_post_url(self):
return reverse('app:post', kwargs={'pk': self.pk})
app\urls.py
app_name = 'app'
urlpatterns = [
url(r'^$', views.index, name='index'),
url(r'^post/(?P<pk>\d+)/$', views.post, name='post')
]
调用视图函数
模板在模型那里构造好 URL 后,就去 urls.py 中匹配到相应的视图。
url(r'^post/(?P<pk>\d+)/$', views.post, name='post')
渲染出新模板
在 views.py 中渲染出新的模板。
def post(request, pk):
post = get_object_or_404(Post, pk=pk)
return render(request, 'app/post.html', context={'post': post})