Передача переменных URL в представление на основе класса

Я только начал возиться с представлениями на основе классов, и я хотел бы иметь доступ к переменным из URL-адреса внутри моего класса. Но у меня возникают трудности с тем, чтобы заставить это работать. Я видел несколько ответов, но все они были такими короткими, что я обнаружил, что они бесполезны.

В основном у меня есть URL

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

Затем я хотел бы использовать ListView для отображения всех статей в конкретном журнале. Моя таблица статей, однако, связана с таблицей журнала через файл 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']

Но я немного потерялся в том, как я должен это делать. Я попробовал это непосредственно в классе, который позволяет мне узнать, что self не существует, или перезаписав get_queryset, и в этом случае он говорит мне, что as_view() принимает только аргументы, которые уже являются атрибутами класса.


person DisneylandSC    schedule 17.01.2017    source источник


Ответы (1)


Если вы переопределите get_queryset, вы сможете получить доступ к journal_id по URL-адресу в self.kwargs:

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

Вы можете узнать больше о динамической фильтрации django в документах.

person Alasdair    schedule 17.01.2017
comment
Кстати, правильно ли я понимаю, что .as_view() генерирует экземпляр класса, который я определяю, и что это также причина, по которой я не могу получить доступ к .self.kwargs в основном бите класса, потому что он описывает свойства класс, а не конкретный экземпляр? - person DisneylandSC; 19.01.2017
comment
Вы не можете получить доступ к self.kwargs в атрибутах класса, потому что класс загружается при запуске сервера до того, как был сделан запрос. Как вы говорите, as_view() возвращает вызываемое представление, используемое в конфигурации URL, но это происходит после загрузки класса. - person Alasdair; 19.01.2017