2014-08-31 2 views
4

Мне нужно добавить дополнительное свойство фильтра (в фоновом режиме) к запросу фильтра django.django-filter: продлить запрос фильтра с request.user

My Model:

class Event(models.Model): 
    name=models.CharField(max_length=254) 
    location=models.ForeignKey(Place) 
    invited_user=models.ManyToManyField(User,null=True, blank=True) 

С фильтром эти записи с таким же адресом могут быть отфильтрованы. Это работает.

Далее я должен исключить все те записи, в которых приглашенный_узел не является request.user (выбор этого свойства фильтра возможен только в том случае, если у пользователя есть разрешения).

Возможно ли это, если django-filter, и если да, то как?

Мой фильтр Класс: импорт django_filters от модели импорта Event

class EventFilter(django_filters.FilterSet): 
    class Meta: 
     model = Event 
     fields = ['location'] 

Моя работа основана на: How do I filter tables with Django generic views?

ответ

0

Я думаю, в вашем случае, вы можете сделать это путем изменения QuerySet в представлении , где вы должны иметь доступ к request.user. Поэтому вам не нужно копать глубоко в django-filter,

В моем случае, при использовании dango_filters FilterView вместе с хрустящими формами для визуализации формы я хотел скрыть поля из формы вместе с дополнительной фильтрацией, так как вы описано выше, так что я отменяю получить() для FilterView, ограничил QuerySet пользователя, и используется редактирование макета хрустящей формы в поп ненужных полей из формы фильтра:

def get(self, request, *args, **kwargs): 
    """ 
    original code from django-filters.views.BaseFilterView - added admin check 
    """ 
    filterset_class = self.get_filterset_class() 
    self.filterset = self.get_filterset(filterset_class) 
    self.object_list = self.filterset.qs 
    # If not admin, restrict to assessor's own centre and clients 
    if not request.user.get_profile().is_admin: 
     self.object_list = self.object_list.filter(attendee__assessor=request.user) 
     self.filterset.form.helper.layout[0].pop(2) # centres filter 
     self.filterset.form.helper.layout[0].pop(1) # assessors filter 
    context = self.get_context_data(filter=self.filterset, 
            object_list=self.object_list) 
    return self.render_to_response(context) 
2

Попробуйте это:

class EventListView(BaseFilterView): 
    ... 
    def get_filterset(self, *args, **kwargs): 
     fs = super().get_filterset(*args, **kwargs) 
     fs.filters['location'].field.queryset = fs.filters['location'].field.queryset.filter(user=self.request.user) 
     return fs 

 Смежные вопросы

  • Нет связанных вопросов^_^