2017-01-17 4 views
4

クラスベースのビューを使い始めたばかりで、クラ​​ス内のURLから変数にアクセスできるようにしたいと考えています。しかし、私はこれを動作させるのが難しいです。私はいくつかの答えを見たが、彼らはとても短かったので、彼らは助けにはならなかった。クラスベースビューへのURL変数の受け渡し

基本的に私はその後、私は特定のジャーナルにすべての記事を表示するのにListViewを使用したいURL

url(r'^(?P<journal_id>[0-9]+)/$', 
    views.Journal_Article_List.as_view(), 
    name='Journal_Page'), 

を持っています。しかし、私の記事テーブルはjournal_idでジャーナルテーブルにリンクされています。だから私は次のことをやります。

class Journal_Article_List(ListView): 
    template_name = "journal_article_list.html" 
    model = Articles 
    queryset = Articles.objects.filter(JOURNAL_ID = journal_id) 
    paginate_by = 12 

    def get_context_data(self, **kwargs): 
     context = super(Journal_Article_List, self).get_context_data(**kwargs) 
     context['range'] = range(context["paginator"].num_pages) 
     return context 

しかし、journal_idは機能ビューのように渡されません。私は私が読んトピックを見つけることができるものから私は

self.kwargs['journal_id'] 

を使用して変数にアクセスすることができますしかし、私は一種の私はそれを行うことになっていますどのように失われています。私は自分自身が存在しないか、get_querysetを上書きすることによって私に教えてくれるクラスの中で直接試しました。その場合、as_view()はすでにクラスの属性である引数だけを受け入れます。あなたがget_querysetをオーバーライドする場合

答えて

6

、あなたはself.kwargsでURLからjournal_idにアクセスできます。

def get_queryset(self): 
    return Articles.objects.filter(JOURNAL_ID=self.kwargs['journal_id']) 

Djangoのダイナミックフィルタリングin the docsについての詳細を読むことができます。

+0

ありがとうございました!これは動作します! – DisneylandSC

+0

ところで、私は、.as_view()が私が定義したクラスのインスタンスを生成することを理解しています。それはまた、クラスのメインビットの.self.kwargsにアクセスできない理由です。クラスと特定のインスタンスではない? – DisneylandSC

+0

クラス属性の 'self.kwargs'にアクセスすることはできません。なぜなら、リクエストが行われる前に、サーバの起動時にクラスがロードされるからです。あなたが言うように、 'as_view()'は、url設定で使用される呼び出し可能なビューを返しますが、クラスがロードされた後*に発生します。 – Alasdair

関連する問題