2016-11-27 69 views
1

我對Django有點新,我想通過構建標準庫應用程序開始。具有多個參數的Django動態網址

我最初創建的是一個使用slu url的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 %} 

然後我就結了thw以下錯誤:

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替換爲某個特定日記名稱的實際字符串,那麼所有功能都可以正常工作。我現在嘗試了很多不同的方法來解決這個問題,但似乎無法找到解決方案。實際上,我甚至不確定該值是否傳遞不到,或者我沒有在模板中正確引用它。任何幫助,將不勝感激!

+1

您沒有將'fjournal'變量傳遞給上下文字典。這個字典'{'articles':articles}'只有'articles'變量。同樣爲它添加'fjournal'參數。 – xyres

+0

該部分對應於列表,我認爲應該只有一個參數沒有?或者它與if語句的其他選項混淆? – DisneylandSC

+0

您是否嘗試添加'fjournal'添加到該上下文字典?不,那裏不應該只有一個變量。你可以添加儘可能多的,你想要的。 – xyres

回答

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或類似的東西。

+0

這解決了我的問題!謝謝。你能否多說一些關於爲什麼把它變成兩個單獨的視圖根據你更好? – DisneylandSC

+0

這是一個主觀意見。清晰明確的代碼更易於維護和調試。一個網址路由 - >一個查看功能。簡單勝於複雜。 Flat比嵌套更好。可讀性計數。 https://www.python.org/dev/peps/pep-0020/ –

1

Django嘗試urlpatterns中的每個模式,並首先返回對應於請求的模式。我相信,只要換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'), 
] 
+0

感謝您的回覆。我試圖交換url模式,不幸的是它給了我完全相同的錯誤。 – DisneylandSC

+0

@DisneylandSC Haken Lid在他的回答和交換網址中說,你似乎也應該將fjournal價值添加到上下文中。 – neverwalkaloner