2016-11-27 52 views
1

私はDjangoを少し新しくしました。私は標準ライブラリアプリを構築することから始めました。複数の引数を持つDjangoの動的URL

私が最初に作成したのは、http://127.0.0.1:8000/Albums/[albumという名前で/にジャーナルのすべての記事を表示するスラッグを使ったURLパターンです。

これは機能しました。私がやったことは、記事の名前をクリック可能にして、曲の詳細を含むページにあなたを紹介することでした。特に、これらの詳細には、http://127.0.0.1:8000/Albums/[articleという名前のリンク/ [article_id] /を介してアクセスできるようにしたいと考えていました。今のarticle_idは、すべての記事を含むデータベーステーブルの主キーです。私は、その後で終わる

{% 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 %} 

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 }) 

そして最後にテンプレート

はそうするために私は2つのURLパターンを定義しました次のエラーメッセージ:

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'変数をコンテキストdictに渡していません。この辞書{'articles ':articles}'には 'articles'変数しかありません。 'fjournal'引数もそれに加えてください。 – xyres

+0

その部分はリストに対応していますが、そこには1つの引数しかないはずですか?それとも、if文の他のオプションをどうにかして混乱させますか? – DisneylandSC

+0

そのコンテキストdictに 'fjournal'を追加しようとしましたか?そして、いいえ、そこにただ一つの変数があるべきではありません。必要な数だけ追加することができます。 – xyres

答えて

3

あなたは文脈でfjournal値を含めていないので、テンプレートエンジンは、ちょうど空の文字列を使用します。私はちょうどurlpatterns内のURLを助けるスワップと信じています。パターンはスラッグの少なくとも1文字を期待しています[\w-]+空のスラッグ文字列はどのURLパターンとも一致しません。

fjournalをコンテキスト辞書に含める必要があります。このようなものはおそらく動作するはずです。

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

また、あなたのコードを読んで、あなたは記事のリスト、代わりに両方のためのJournal_Article_Pageを使用して二つの異なるビュー関数への物品自体を分割する場合は維持するために容易になります。

関数名には小文字だけを使用することも慣例です。したがって、関数article_pagejournal_article_listなどを呼び出すことができます。

+0

これは私の問題を解決しました!ありがとう。これを2つの別々の見解に変えるのがなぜあなたの方が良いのだろうということについてもっと言いたいことがありますか? – DisneylandSC

+0

主観的な意見です。明快で明示的なコードは、維持およびデバッグが容易です。 1つのURL経路 - > 1つのビュー機能。シンプルではなく複雑です。フラットはネストされたものよりも優れています。可読性は数えます。 https://www.python.org/dev/peps/pep-0020/ –

1

Djangoはurlパターンの各パターンを試して、最初にrequestに対応するものを返します。

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が答えを出してURLを交換したときに、fjournalの価値を文脈に追加する必要があるようです。 – neverwalkaloner

関連する問題