Django как разрешить пользователю устанавливать значение paginate_by в профиле - PullRequest
1 голос
/ 30 марта 2020

Я разрешаю моим пользователям обновлять свой профиль и устанавливать значение paginate_by для различных страниц ListView. Как мне получить доступ к этому значению в моем представлении? В настоящее время по умолчанию используется значение 20, как показано:

class CandidateListView(LoginRequiredMixin, ListView):
    template_name = 'recruiter/candidate_list.html'
    context_object_name = 'candidates'
    paginate_by = 20

Вместо 20 я хочу получить доступ к этому полю в своем профиле. Нужно ли передавать его для просмотра в качестве параметра? Спасибо.

1 Ответ

3 голосов
/ 30 марта 2020

Если у пользователя есть связанная модель Profile с полем, например:

from django.conf import settings

class Profile(models.Model):
    user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    <b>paginate_by</b> = models.PositiveIntegerField(default=10)
    # &hellip;

Вы можете переопределить метод .get_paginate_by(..) [Django -doc] :

class CandidateListView(LoginRequiredMixin, ListView):
    template_name = 'recruiter/candidate_list.html'
    context_object_name = 'candidates'

    def get_paginate_by(self, queryset):
        return <b>self.request.user.profile.paginate_by</b>

Может быть безопаснее обернуть это try - except, если .profile не существует:

class CandidateListView(LoginRequiredMixin, ListView):
    template_name = 'recruiter/candidate_list.html'
    context_object_name = 'candidates'
    paginate_by = 20

    def get_paginate_by(self, queryset):
        try:
            return self.request.user.profile.paginate_by
        except Profile.DoesNotExist:
            return super().get_paginate_by(queryset)

Здесь вы вернетесь к 20, когда профиль для этого пользователя не существует.

Вы можете вернуть None, если не хотите разбивать результат на страницы.

...