Как сделать так, чтобы фильтр Django отображался только для некоторых пользователей? - PullRequest
0 голосов
/ 05 августа 2020

Я работаю над проектом Django и хочу знать, как мне сделать так, чтобы поле фильтра отображалось только в том случае, если пользователь является суперпользователем. Мой фильтр выглядит так:

class OrderFilter(FilterUserMixin):
    customer = django_filters.CharFilter(label='Cliente', method='filter_name')

    def filter_name(self, queryset, name, value):
        queryset = queryset.filter(customer__phone__icontains=value)
        return queryset

    class Meta:
        model = Order
        fields = ("store", "customer", "date")
        filter_overrides = {
            models.CharField: {
                'filter_class': django_filters.CharFilter,
                'extra': lambda f: {
                    'lookup_expr': 'icontains',
                },
            }
        }

Все обычные пользователи должны иметь возможность фильтровать по покупателям и дате, но только суперпользователи должны иметь возможность фильтровать по магазину, остальные пользователи всегда должны видеть заказы один магазин, поэтому фильтрация магазина не требуется.

Я не знаю, как это сделать sh, я использую это представление:

class OrderTableView(LoginRequiredMixin, PagedFilteredTableView):
    model = Order
    table_class = OrderTable
    template_name = 'order/order_list.html'
    paginate_by = 50
    filter_class = OrderFilter
    formhelper_class = OrderFilterFormHelper
    exclude_columns = ('actions',)
    export_name = 'orders'

    def get_queryset(self, **kwargs):
        qs = super(OrderTableView, self).get_queryset()
        if self.request.user.profile.store is not None and self.request.user.is_superuser is False:
            qs = qs.filter(store=self.request.user.profile.store)
        qs = qs.filter(total__gt=0).filter(address__isnull=False).filter(location__isnull=False)
        return qs

1 Ответ

0 голосов
/ 07 августа 2020

один из способов решения:

class OrderFilter(FilterUserMixin):
  # omit the other codes
  def __init__(self, *args, **kwargs):
    super().__init__(*args, **kwargs)
    if not self.request.user.is_superuser and self.filters.get('store'):
      self.filters.pop('store')

затем сбросьте соответствующий код для суперпользователя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...