具有多个参数的Django动态URL

时间:2016-11-27 15:59:11

标签: python django django-templates

我对Django有点新鲜,我想我会从构建标准库应用程序开始。

我最初创建的是一个使用slug的url模式,通过http://127.0.0.1:8000/Albums/[album name] /显示日记中的所有文章。

这很有用。我接下来尝试做的是使文章名称可点击,以便他们将您引导到包含该歌曲详细信息的页面。特别是我希望通过http://127.0.0.1:8000/Albums/[article名称] / [article_id] /形式的链接访问这些详细信息。其中article_id是包含所有文章的数据库表中的主键。

为了做到这一点,我定义了两个url模式:

urlpatterns = [
    url(r'^(?P<slug_journal>[\w-]+)/$', views.Journal_Article_Page, name='Journal_Page'),
    url(r'^(?P<slug_journal>[\w-]+)/(?P<id>\d+)/$', views.Journal_Article_Page, name='Journal_Article_Page'),
]

和观点:

def Journal_Article_Page(request, slug_journal=None, id=None):
    if slug_journal:
        if id:
            farticle = get_object_or_404(Article_Draft_Table_1, DRAFT_ID = id)
            return render(request, 'journal_article_details.html', { 'farticle': farticle, 'fjournal': slug_journal })
        else:
            fjournal = get_object_or_404(Journal_Table, Journal_slug = slug_journal).JOURNAL_ID
            articles = Article_Draft_Table_1.objects.filter(JOURNAL_ID = fjournal)
            return render(request, 'journal_articles.html', { 'articles': articles })

最后一个模板:

{% extends 'base.html' %}

{% block content %}

    <p>List of articles.</p>

    <br>

    {% for article in articles %}
        <div class="col-sm-10">
        <a href='{% url "Journal_Article_Page" slug_journal=fjournal id=article.DRAFT_ID %}'>{{ article.Draft_title }}</a>
        </div>
    {% endfor %}

{% endblock %}

然后我结束了以下错误:

Reverse for 'Journal_Article_Page' with arguments '()' and keyword arguments '{'id': 3, 'slug_journal': ''}' not found. 1 pattern(s) tried: ['Journals/(?P<slug_journal>[\\w-]+)/(?P<id>\\d+)/$']

对我而言似乎暗示slug_journal字符串未正确传递。事实上,如果我将模板中的fjournal与特定期刊名称的实际字符串交换,一切都可行。我现在尝试了许多不同的方法来解决这个问题,但似乎无法找到解决方案。事实上,我甚至不确定是否传递了值,或者我是否在模板中没有正确引用它。任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:3)

您没有在上下文中包含fjournal值,因此模板引擎只会使用空字符串。该模式期望slug [\w-]+中至少有一个字符,因此空的slug字符串将不匹配任何url模式。

您必须在上下文词典中包含fjournal。这样的事情应该可行。

return render(request, 'journal_articles.html', 
              {'articles': articles, 'fjournal': slug_journal})

此外,如果您将文章列表和文章本身拆分为两个不同的视图函数而不是使用Journal_Article_Page,则您的代码将更易于阅读和维护。

在函数名中只使用小写字母也是惯例。因此,您可以调用函数article_pagejournal_article_list或类似的东西。

答案 1 :(得分:1)

Django尝试urlpatterns中的每个模式并首先返回与request相对应的模式。我相信在urlpatterns中交换网址会有所帮助:

urlpatterns = [    
url(r'^(?P<slug_journal>[\w-]+)/(?P<id>\d+)/$', views.Journal_Article_Page, name='Journal_Article_Page'),
url(r'^(?P<slug_journal>[\w-]+)/$', views.Journal_Article_Page, name='Journal_Page'),
]