@Vlad1987
учу Python

Как воспользоваться self.kwargs вне CBV?

Приступил к изучению Джанго и вот нарвался на такую проблему. Подскажите, пожалуйста, можно ли как то использовать конструкцию self.kwargs[] вне Class Based View?

Объясню:
Есть представление:

Сlass NewsByCategory(ListView): 
        model = News
        template_name = 'news/home_news_list.html'
        context_object_name = 'news'
        allow_empty = False
    
        def get_context_data(self, *, object_list=None, **kwargs):
            context = super().get_context_data(**kwargs)  # контекст модели
            context['title'] = Category.objects.get(pk=self.kwargs['category_id'])  
            return context
    
        def get_queryset(self):
            return News.objects.filter(category_id=self.kwargs['category_id'], is_published=True)

Есть путь из url.py:

path('category/<int:category_id>/', NewsByCategory.as_view(extra_context={'title': 'Какой-то тайтл'}),
             name='category'),


И есть кастомный тэг:

@register.inclusion_tag('news/list_categories.html')
    def show_categories(arg1='Hello', arg2='World'):
        categories = Category.objects.all()
        return {'categories': categories, 'arg1': arg1, 'arg2': arg2}

Данный кастомный тэг рендерит шаблон:

<div class="list-group">
        {%for item in categories%}
        <a href="{{ item.get_absolute_url }}" class="list-group-item list-group-item-action">{{item.title}}</a>
        {% endif %}
        {%endfor%}
    </div>


Зачем мне это надо: Сейчас при помощи данного тэга создаётся боковая панелька в которой выводятся ссылки на новости с конкретной категорией. Так вот я бы хотел, чтобы на странице с новостями определённой категории, ссылка на эту же страницу была не активна. т.е. если к примеру открыта страница с новостями о спорте, то хотелось бы, чтобы в боковой панели были активны ссылки на все остальные страницы, кроме текущей.

вот как я примерно вижу шаблон боковой панели:

<div class="list-group">
        {%for item in categories%}
        {% if item.pk !=  self.kwargs['category_id'] %}
        <a href="{{ item.get_absolute_url }}" class="list-group-item list-group-item-action">{{item.title}}</a>
        {% elif %}
        <p class="selected">{{item.title}}</p>
        {% endif %}
        {%endfor%}
    </div>


Осталось понять как реализовать это в кастомном тэге...

Спасибо!
  • Вопрос задан
  • 56 просмотров
Решения вопроса 1
@bacon
Передать category в кастомный тег параметром или вообще передать весь контекст (takes_context=True)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы