2016-03-31 7 views
0

私が取り組んでいるブログプロジェクトで期待どおりにListViewをレンダリングするのに問題がありました。ListViewでget_queryset()メソッドを使用すると、Django 1.9

次のように私は(models.pyで私のPostモデルから)、Postモデルの一部であるTagモデルを、持って次のようにviews.py

class Post(models.Model): 
    (...) 
     tags = models.ManyToManyField(Tag) 

TagListViewは次のとおりです。

class TagListView(ListView): 
    def get_queryset(self): 
     slug = self.kwargs['slug'] 
     try: 
      tag = Tag.objects.get(slug=slug) 
      return tag.post_set.all() 
     except Tag.DoesNotExist: 
      return Post.objects.none() 
次のように

のURLは url(r'^blog/?', include('blog.urls')),かかわらず、であるように、次のようにプロジェクトに含まれている(ある:

url(r'^tag/(?P<slug>[a-zA-Z0-9-]+)?/?$', TagListView.as_view(
     paginate_by=5, 
     model=Tag, 
    )), 

この例ではlocalhost:8000/blog/tag/<name-of-tag-here>にあるURLにアクセスすると、views.pyのTagListViewが呼び出され、get_queryset()メソッドを使用して同じスラッグのタグを含む投稿のListViewが生成されます。 (/blog/templates/blog)、私が見ているチュートリアルではtag_post_list.htmlと呼ばれるテンプレートが検索されますが、ListViewがレンダリングするテンプレートを見つけ出す方法は不明です。古いチュートリアル。

私は、どの変数がHTMLテンプレートに渡されているのか、それらにアクセスする方法について少し混乱しています。結果から、get_queryset()は実際には同じタグリストの投稿のみを返すわけではないことは明らかです。私のbase.htmlファイルの他のタグと要素が明白に明らかであるにもかかわらず、Furthermore, my css isn't rendering, either (which I've made a separate post for)です。

テンプレートは(/blog/templates/にあります)から始まり、{% for post in object_list %}で投稿にアクセスします。 object_list明らかに、私が理解する限り、リストビューのget_queryset()メソッドを誤用している方法に起因するはずです。

ありがとうございました。

+0

ここに欠落しているデバッグがあります。このビューが実際に呼び出されていることを確認しましたか?スラッグの引数が正しいことを確認しましたか?コードは 'get_queryset'に入りますか?あなたはその方法から返されているものを調べましたか?デバッガでこれをすべて実行することもできますし、印刷文を入れるだけで関連する点です。 –

+0

これ以外には、これはタグではなく投稿のリストなので、モデルは投稿でなければなりません。しかし、それは何にも影響しません。 –

+0

'object_list'には実際に何が入っていますか?何もない?他に何か? – YPCrumble

答えて

2

ここに解凍する質問がたくさんあります。カップルの答え:

あなたListViewは、あなたがそうのように、使用するテンプレートを指定することができtemplate_nameの属性があります。

class TagListView(ListView): 

    template_name = "tag_post_list.html" 

    def get_queryset(self): 
     slug = self.kwargs['slug'] 
     try: 
      tag = Tag.objects.get(slug=slug) 
      return tag.post_set.all() 
     except Tag.DoesNotExist: 
      return Post.objects.none() 

はクラスベースのビューのために利用可能な属性の簡単なリストについては、this siteを参照してください。

第二の答え - あなたはそれを言っている:

tag = Tag.objects.get(slug=slug) 
return tag.post_set.all() 

...あなたのビューで実際に正しいPostオブジェクトを返していません。これがなぜあなたのコードから明らかではないのですか? Daniel Rosemanは、おそらくTagではなくPostというモデルに基づいているはずだと指摘しています。 get_querysetメソッドをオーバーライドしてPostオブジェクトを返すこともできますが、これは問題の問題ではありません。テンプレートが呼び出されていないため、object_listが呼び出されていないため、最初の問題を修正すると実際には2番目の問題が修正される可能性があります。

+0

ありがとうございます。このリンクには、ドキュメンテーションの内容が説明されています。 'template_name =" tag_post_list.html "を追加すると、私が探していた結果が得られたように見えますが、実際にはそれほど意味をなさないので、今考えています。 ここでその静的ファイルの問題を解決します。 –