Найти - Пользователи
Полная версия: ListView и именованный аргумент в url
Начало » Django » ListView и именованный аргумент в url
1 2
WalinoR
Подскажите пожалуйста такой момент. Как мне получить значение именованного аргумента из url'а в ListView, не могу понять что не так…

urls.py:
urlpatterns = [
    url(r'^page/(?P<num_page>\d+)/$', view.ArticlesMain.as_view(), name="articles_main"),
    url(r'^$', view.ArticlesMain.as_view(), name="articles_main"),
]

View.py:
class ArticlesMain(ListView):
    template_name = "articles_main.html"
    model = Article
    paginate_by = 1
    page_kwarg = "num_page"
    context_object_name = "articles"
    
    def get_context_data(self, **kwargs):
        context = super(ArticlesMain, self).get_context_data(**kwargs)
        articles = Article.objects.all()
        paginator = Paginator(articles, self.paginate_by)
        try:
            page_num = self.request.GET.get("num_page")
        except KeyError:
            page_num = 1
        try:
            articles_page = paginator.page(page_num)
        except InvalidPage:
            articles_page = paginator.page(1)
        
        #pages  - переменная, которая передается в шаблон и формирует вид переключателя страниц
        pages = []
        curr_page = articles_page.number
        range_page = paginator.page_range
        number_pages = paginator.num_pages
        if number_pages >= 10 and curr_page >= 10:
            if curr_page >= range_page[-4]:
                pages.append(range_page[0])
                pages.append('points')
                [pages.append(i) for i in range(range_page[-1] - 5, range_page[-1] + 1)]
            else:
                pages.append(range_page[0])
                pages.append('points')
                [pages.append(i) for i in range(curr_page - 3, curr_page + 4)]
                pages.append('points')
                pages.append(range_page[-1])
        if number_pages >= 10 > curr_page:
            [pages.append(i) for i in range(1, 11)]
            if number_pages != 11:
                pages.append('points')
            pages.append(range_page[-1])
        if number_pages < 10 and curr_page < 10:
            [pages.append(i) for i in range_page]
        context["articles"] = articles
        context["articles_page"] = articles_page
        context["pages"] = pages
        return context

FishHook
self.kwargs['num_page']
WalinoR
вот это да…
FishHook - спасибо тебе!
WalinoR
Есть ли у django какой нибудь встроенный элемент, который мог бы формировать такой переключатель:


Или каждый делает по своему?
FishHook
конечно
FishHook
WalinoR
И это, как бы тебе сказать…
Ты неправильно CBV используешь. Совсем.
WalinoR
буду признателен, если объяснишь. я только учусь и поэтому буду рад любым советам
WalinoR
я гуглил про пагинатор, но там не рассматривается вопрос, что нужно менять вид переключателя в зависимости от выбранной текущей страницы. поэтому я формирую список page, а потом в шаблоне вывожу нужный вид:

{% block pagination %}
    {% if page_obj.paginator.num_pages > 1 %}
	<div class="pagination">
        <ul>
        {% if page_obj.has_previous %}
             <a href="{% url "blog:articles_main" page_obj.previous_page_number %}"><li>&#8592;</li></a>
        {% else %}
             <li class="tree_point">&#8592;</li>
        {% endif %}     
        
        {% for num in pages %}
            {% if num == 'points' %}
                <li class="tree_point">...</li>
            {% elif num == page_obj.number %}
                <li id="active">{{ num }}</li>
            {% else %}
                <a href="{% url "blog:articles_main" num %}"><li>{{ num }}</li></a>
            {% endif %}
        {% endfor %}
        
        {% if page_obj.has_next %}
            <a href="{% url "blog:articles_main" page_obj.next_page_number %}"><li>&#8594;</li></a>
        {% else %}
             <li class="tree_point">&#8594;</li>        
        {% endif %}
        </ul>
    </div>
    {% endif %}
{% endblock pagination %}

3 вида:




Я придумал только такой способ
FishHook
CBV - это дженерики, то есть готовые решения для стандартных задач.
Например, задача - отобразить список объектов решается стандартным классом ListView.
Для этого класс предоставляет набор специфических атрибутов и делает всю работу по подготовку списка, его паджинации и передаче его в контекст без лишних действий.
class ArticleListView(ListView):
    model = Article
    paginate_by = 10
Это законченый самодостаточный класс представления.
А ты делаешь всю работу сам, зачем то. Ну и нахрена тогда тебе ListView?
WalinoR
Я понял, но если я так напишу и у меня допустим будет 100 страниц. То на сайте у меня будет 100 кнопок подряд для переключения страниц. Так вот где мне тогда написать логику, чтобы организовать такой переключатель, как я показал в предыдущем посте (ну или как на данном форуме). В шаблоне?
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB