2014-08-31 88 views
4

我需要在Django過濾器請求中添加一個額外的過濾器屬性(在後臺)。django-filter:使用request.user擴展過濾器查詢

我的模型:

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

帶有過濾器具有相同位置的條目可以被過濾。這是行得通的。

更進一步,我必須排除所有這些條目,其中invite_user不是request.user(只有在用戶有權限時才選擇此過濾器屬性)。

這是可能與Django的過濾器,如果是的如何?

我的過濾器類:從模型導入事件 進口django_filters

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

我的工作是基於:How do I filter tables with Django generic views?

回答

0

我覺得你的情況,你可以通過在視圖中修改查詢集做,你應該能夠訪問request.user。因此,你不需要深入挖掘Django過濾器,

在我的情況下,當使用dango_filters FilterView和脆皮形式來呈現表單時,我想從表單中隱藏字段以及額外的過濾所描述的,所以我推翻了FilterView get()方法,限制了查詢集給用戶,並用香脆形式的佈局編輯彈出從過濾器形式的不必要的字段:

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