Django初学者笔记系列(五):显示特定主题的页面

显示特定主题的页面

1.url模式

显示特定主题的页面的URL模式与前面的所有URL模式都稍有不同,因为它将使用主题的id 属性来指出请求的是哪个主题。例如,如果用户要查看主题Chess(其id 为1)的详细
页面,URL将为http://localhost:8000/topics/1/。下面是与这个URL匹配的模式,它包含在learning_logs/urls.py中:


"""定义learning_logs的URL模式"""
from django.conf.urls import url
from . import views

urlpatterns = [
    # 主页
    url(r'^$', views.index, name='index'),

    #显示所有的主题
    url(r'^topics/$', views.topics, name='topics')

    #特定主题的详细页面
    url(r'^topics/(?P\d+)/$' , views.topic, name='topic')
    
]

(?P\d+)表示与整数匹配,并将这个整数存储在一个名为topic_id的实参中

Django将调用视图函数topic() ,并将存储在topic_id 中的值作为实参传递给它

2.视图

def topic(request, topic_id):
    """显示单个主题及其所有条目"""
    topic = Topic.objects.get(id=topic_id)
    entries = topic.entry_set.order_by('-date_added')
    context = {
     'topic':topic, 'entries': entries}
    return render(request, 'learning_logs/topic.html', context)

这是第一个除request 对象外还包含另一个形参的视图函数。这个函数接受正则表达式(?P\d+) 捕获的值,并将其存储到topic_id 中

我 们使用get() 来获取指定的主题,就像前面在Django shell中所做的那样

我们获取与该主题相关联的条目,并将它们按date_added 排序:date_added 前面的减号指定按降序排列,即先显示最近的条目

我们将主题和条目都存储在字典context 中,再将这个字典发送给模板topic.html

3.模版

{
     % extends 'learning_logs/base.html' %}
{
     % block content %}

  <p>Topic: {
     {
      topic }}</p>
  <p>Entries:</p>
  <ul>
      {
     % for entry in entries %}
      <li>
          <P>{
     {
      entry.date_added|date:'M d, Y H:i' }}</P>
          <p>{
     {
      entry.text|linebreaks }}</p>
      </li>
      {
     % empty %}
      <li>
          There are no entries for this topic yet
      </li>
      {
     % endfor %}
  </ul>

{
     % endblock content%}

我们显示当前的主题,它存储在模板变量{ { topic }}中。为什么可以使用变量topic呢?因为它包 含在字典context 中

每个项目列表项都将列出两项信息:条目的时间戳和完整的文本。在Django模板中,竖线(| )表示模板过滤器—— 对模板变量的值进行修改的函数。

过滤器date: 'M d, Y H:i’以这样的格式显示时间戳:January1,201523:00。接下来的一行显示text的完整值,而不仅仅是entry的前 50个字符。过滤器linebreaks将包含换行符的长条目转换为浏览器能够理解的格式,以免显示为一个不间断的文本块。

4.将显示所有主题的页面中的每个主题都设置为链接

在浏览器中查看显示特定主题的页面前,我们需要修改模板topics.html,让每个主题都链接到相应的网页,如下所示:

{
     % extends "learning_logs/base.html" %}

{
     % block content%}

  <p>Topics</p>
  <ul>
      {
     % for topic in topics %}
      <li>
          <a href="{% url 'learning_logs:topic' topic.id %}">{
     {
      topic }}</a>
      </li>
      {
     %empty%}
      <li>No topics have been added yet.</li>
      {
     % endfor %}
  </ul>

{
     % endblock content %}

**我们使用模板标签url 根据learning_logs中名为topic 的URL模式来生成合适的链接。这个URL模式要求提供实参topic_id ,因此我们在模板标签url 中添加了属性topic.id 。现在,主题列表中的每个主题都是一个链接,链接到显示相应主题的页面,如http://localhost:8000/topics/1/。
**

你可能感兴趣的:(python,django)