我是Django的新手,我认为我将从构建标准库应用程序开始。

我最初创建的是使用子弹的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替换为特定期刊名称的实际字符串,则一切正常。我现在已经尝试了多种方法来解决此问题,但似乎找不到解决方案。实际上,我什至不确定该值是否未传递,或者我是否在模板中未正确引用它。任何帮助,将不胜感激!

最佳答案

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

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

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


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

约定在函数名称中仅使用小写字母。因此,您可以调用函数article_pagejournal_article_list或类似的函数。

10-07 15:08