[英]How to pass Current user to Django_filters ModelChoiceFilter queryset
How to pass Current user to Django_filters ModelChoiceFilter
queryset.如何将当前用户传递给Django_filters ModelChoiceFilter
。
I'm trying to filter the ModelChoiceFilter
based on the current user , i've used the init
method in the filter but it failed:我正在尝试根据当前用户过滤ModelChoiceFilter
,我在过滤器中使用了init
方法,但它失败了:
here is the code I've used :这是我使用的代码:
views.py视图.py
def requests_reports(request):
f = RequestsFilter(request.GET, queryset=LeaveRequest.objects.filter(user=request.user), user=request.user)
context = {
'filter': f,
}
return render(request, 'requests_reports.html', context)
forms.py表格.py
class RequestsFilter(django_filters.FilterSet):
def __init__(self, *args, **kwargs):
self.user = kwargs.pop('user')
super(RequestsFilter, self).__init__(*args, **kwargs)
self.fields['employee'].queryset = Employee.objects.filter(user=self.user)
start_date = DateFilter(field_name='date_time', lookup_expr='gt', widget=forms.TextInput(attrs={'type': 'date'}))
end_date = DateFilter(field_name='date_time', lookup_expr='lt', widget=forms.TextInput(attrs={'type': 'date'}))
class Meta:
model = LeaveRequest
fields = ['employee', 'type']
It returns this error :它返回此错误:
'RequestsFilter' object has no attribute 'fields'
Use the normal _init_
but instead of self.fields['field_name]
use self.filters[field_name]
使用正常_init_
但不是self.fields['field_name]
使用self.filters[field_name]
Try this code:试试这个代码:
class RequestsFilter(django_filters.FilterSet):
def __init__(self, *args, **kwargs):
self.user = kwargs.pop('user')
super().__init__(*args, **kwargs)
self.filters['employee'].queryset = Employee.objects.filter(user=self.user)
start_date = DateFilter(field_name='date_time', lookup_expr='gt', widget=forms.TextInput(attrs={'type': 'date'}))
end_date = DateFilter(field_name='date_time', lookup_expr='lt', widget=forms.TextInput(attrs={'type': 'date'}))
employee = django_filters.ModelChoiceFilter(queryset=None, field_name='employee' )
class Meta:
model = LeaveRequest
fields = ['employee', 'type', 'date_time']
I don't have much experiance in Django, but what I see is you can not use meta attributes inside just like self.fields
, you have to find another way to do it.我在 Django 中没有太多经验,但我看到你不能像self.fields
一样在内部使用元属性,你必须找到另一种方法来做到这一点。
you can find more information on how to use filtershere您可以在此处找到有关如何使用过滤器的更多信息
you can set a custom method.您可以设置自定义方法。 More info here: https://django-filter.readthedocs.io/en/master/guide/usage.html#customize-filtering-with-filter-method更多信息: https : //django-filter.readthedocs.io/en/master/guide/usage.html#customize-filtering-with-filter-method
class RequestsFilter(django_filters.FilterSet):
def __init__(self, *args, **kwargs):
self.user = kwargs.pop('user')
super().__init__(*args, **kwargs)
employee = django_filters.filters.ModelMultipleChoiceFilter(
field_name='employee',
queryset=Employee.objects.all(),
method="filter_employee",
)
start_date = DateFilter(field_name='date_time', lookup_expr='gt', widget=forms.TextInput(attrs={'type': 'date'}))
end_date = DateFilter(field_name='date_time', lookup_expr='lt', widget=forms.TextInput(attrs={'type': 'date'}))
class Meta:
model = LeaveRequest
fields = ['employee', 'type']
def filter_employee(self, queryset, name, value):
qs = queryset.filter(user=self.user).filter(**{name: value})
if len(qs) >= 1:
return qs[0]
else:
return None
You can access the following in the init of the filterset:您可以在过滤器集的初始化中访问以下内容:
user = kwargs['request'].user
For example, this is from my project but I hope it helps someone:例如,这是来自我的项目,但我希望它可以帮助某人:
class MenuItemListFilter(django_filters.FilterSet):
def __init__(self, *args, **kwargs):
user = kwargs['request'].user
super().__init__(*args, **kwargs)
self.filters['section'].queryset = MenuSection.objects.filter(business=user.business)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.