Я только что начал возиться с представлениями на основе классов, и я хотел бы иметь доступ к переменным из 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
Однако журнал__диски не передается, как в функциональных представлениях. Из того, что я мог найти на эту тему я прочитал, я могу получить доступ к переменной с помощью
self.kwargs['journal_id']
Но я бы потерял от того, как я должен сделать это. Я пробовал это прямо в классе, что позволяет мне знать, что само не существует или перезаписывается get_queryset, и в этом случае он сообщает мне, что as_view()
принимает только аргументы, которые уже являются атрибутами класса.
Спасибо! Это работает! – DisneylandSC
BTW, правильно ли я понимаю, что .as_view() генерирует экземпляр класса, который я определяю, и это также является причиной того, что я не могу получить доступ к .self.kwargs в основном бите класса, потому что он описывает свойства класс, а не конкретный экземпляр? – DisneylandSC
Вы не можете получить доступ к атрибутам 'self.kwargs' в классе, потому что класс загружается при запуске сервера, прежде чем запрос будет выполнен. Как вы говорите, 'as_view()' возвращает разрешаемое представление, используемое в конфигурации url, но это происходит * после того, как * загружен класс. – Alasdair