我是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_page
和journal_article_list
或类似的函数。