Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 4, 2016 14:48:16

WalinoR
От: Бердянск, Украина
Зарегистрирован: 2015-09-08
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

ListView и именованный аргумент в url

Подскажите пожалуйста такой момент. Как мне получить значение именованного аргумента из 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

Отредактировано WalinoR (Фев. 4, 2016 14:48:36)

Офлайн

#2 Фев. 4, 2016 14:59:30

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

ListView и именованный аргумент в url

self.kwargs['num_page']



Офлайн

#3 Фев. 4, 2016 15:06:01

WalinoR
От: Бердянск, Украина
Зарегистрирован: 2015-09-08
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

ListView и именованный аргумент в url

вот это да…
FishHook - спасибо тебе!

Офлайн

#4 Фев. 4, 2016 15:19:33

WalinoR
От: Бердянск, Украина
Зарегистрирован: 2015-09-08
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

ListView и именованный аргумент в url

Есть ли у django какой нибудь встроенный элемент, который мог бы формировать такой переключатель:


Или каждый делает по своему?

Офлайн

#5 Фев. 4, 2016 15:30:54

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

ListView и именованный аргумент в url

Офлайн

#6 Фев. 4, 2016 15:32:32

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

ListView и именованный аргумент в url

WalinoR
И это, как бы тебе сказать…
Ты неправильно CBV используешь. Совсем.



Офлайн

#7 Фев. 4, 2016 15:34:12

WalinoR
От: Бердянск, Украина
Зарегистрирован: 2015-09-08
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

ListView и именованный аргумент в url

буду признателен, если объяснишь. я только учусь и поэтому буду рад любым советам

Офлайн

#8 Фев. 4, 2016 15:37:23

WalinoR
От: Бердянск, Украина
Зарегистрирован: 2015-09-08
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

ListView и именованный аргумент в url

я гуглил про пагинатор, но там не рассматривается вопрос, что нужно менять вид переключателя в зависимости от выбранной текущей страницы. поэтому я формирую список 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 вида:




Я придумал только такой способ

Отредактировано WalinoR (Фев. 4, 2016 15:40:13)

Офлайн

#9 Фев. 4, 2016 15:42:27

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

ListView и именованный аргумент в url

CBV - это дженерики, то есть готовые решения для стандартных задач.
Например, задача - отобразить список объектов решается стандартным классом ListView.
Для этого класс предоставляет набор специфических атрибутов и делает всю работу по подготовку списка, его паджинации и передаче его в контекст без лишних действий.

class ArticleListView(ListView):
    model = Article
    paginate_by = 10
Это законченый самодостаточный класс представления.
А ты делаешь всю работу сам, зачем то. Ну и нахрена тогда тебе ListView?



Офлайн

#10 Фев. 4, 2016 16:00:01

WalinoR
От: Бердянск, Украина
Зарегистрирован: 2015-09-08
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

ListView и именованный аргумент в url

Я понял, но если я так напишу и у меня допустим будет 100 страниц. То на сайте у меня будет 100 кнопок подряд для переключения страниц. Так вот где мне тогда написать логику, чтобы организовать такой переключатель, как я показал в предыдущем посте (ну или как на данном форуме). В шаблоне?

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version