Django 根据存储在视图中的变量显示页面标题

Dru*_*ngo 3 python django django-views

我\xe2\x80\x99m 有点困惑如何显示使用相同模板列出不同类别文章的 2 个页面的标题。我的文章模型有内容、类别(体育、政治、科技等)和状态。我想显示一个列出所有体育文章的页面和一个列出政治的页面,并且我想使用相同的模板。我尝试将标题存储为视图中的变量,但这不起作用

\n\n

视图.py

\n\n
 def sport_landing(request):\n    page_title = \'Sport\'\n    cat_landing = Article.objects.filter(status=\'published\', category=\'sport\', published_date__lte=timezone.now()\n        ).order_by(\'-published_date\')\n    return render(request, "categorylanding.html", {\'cat_landing\': cat_landing}\n
Run Code Online (Sandbox Code Playgroud)\n\n

模板

\n\n
   {% extends \'base.html\' %}\n    {% load humanize %}\n    {% block content %}\n    <div class="row category-landing-title">\n        <div class="col-xs-12">\n            {% page_title %}\n        </div>\n    </div>\n.\n.\n.\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是最好的方法吗?

\n

PRM*_*reu 5

您需要将变量传递到上下文:

def sport_landing(request):
    page_title = 'Sport'
    cat_landing = Article.objects.filter(status='published', category='sport', published_date__lte=timezone.now()
        ).order_by('-published_date')
    return render(request, "categorylanding.html", {'cat_landing': cat_landing, 'page_title':page_title }
Run Code Online (Sandbox Code Playgroud)

{在模板中使用双大括号({% %}用于模板标签):

{{page_title}}
Run Code Online (Sandbox Code Playgroud)

要回答整个模式,您可以通过在 url 模式中使用参数来避免为每个类别重复代码:

在文件 urls.py 中添加并调整此行,这将允许您将类别作为参数传递给您的视图:

url(r'^category/(?P<category>\w+)', views.cat_landing) # i.e : mysite/category/sport
Run Code Online (Sandbox Code Playgroud)

您需要声明一个通用视图,例如:

def cat_landing(request, category=None):
    if category:
        cat_landing = Article.objects.filter(status='published', category=category, 
                                             published_date__lte=timezone.now()
                                      ).order_by('-published_date')

        return render(request, "categorylanding.html", 
                      {'cat_landing': cat_landing, 'page_title':category.title() }
    else:
        return [...redirect to main menu... ]
Run Code Online (Sandbox Code Playgroud)