2017-01-17 6 views
4

Я только что начал возиться с представлениями на основе классов, и я хотел бы иметь доступ к переменным из 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() принимает только аргументы, которые уже являются атрибутами класса.

ответ

6

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

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

Вы можете прочитать больше о динамической фильтрации Джанго in the docs.

+0

Спасибо! Это работает! – DisneylandSC

+0

BTW, правильно ли я понимаю, что .as_view() генерирует экземпляр класса, который я определяю, и это также является причиной того, что я не могу получить доступ к .self.kwargs в основном бите класса, потому что он описывает свойства класс, а не конкретный экземпляр? – DisneylandSC

+0

Вы не можете получить доступ к атрибутам 'self.kwargs' в классе, потому что класс загружается при запуске сервера, прежде чем запрос будет выполнен. Как вы говорите, 'as_view()' возвращает разрешаемое представление, используемое в конфигурации url, но это происходит * после того, как * загружен класс. – Alasdair

 Смежные вопросы

  • Нет связанных вопросов^_^