【发布时间】:2021-04-22 17:24:35
【问题描述】:
我一直试图弄清楚如何使用 Django-filter 和 Django-tables2 仅显示表中列值设置为 true 的行,但我似乎无法使代码正常工作。
我能够生成表格并生成过滤器,但根据谁登录到应用程序,我只想显示“is_reviewed”列设置为 true 的记录。
我以为我在 views.py 文件中使用以下行让它工作了,但后来发现它根本没有将过滤器应用于我的查询集:
# only show scenarios that have been reviewed and published, or scenarios that the user submitted.
# self.table_data = self.table_data.filter(Q(is_reviewed=True) | Q(submitter = request.user)).order_by("-id")
https://github.com/alexandroidii/cst8333
这是我目前所拥有的:
Views.py
class FilteredScenarioListView(SingleTableMixin, FilterView):
model = Scenario
template_name = "rlcs/scenario_list.html"
table_pagination = {'per_page': 5}
ordering = '-id'
def get(self, request, *args, **kwargs):
is_reviewer = request.user.groups.filter(name='reviewer').exists() or request.user.is_superuser
if is_reviewer:
self.table_class = ReviewerScenarioTable
self.form_class = ReviewerScenarioFilterForm
self.filterset_class = ReviewerScenarioFilter
elif request.user.is_authenticated:
self.table_class = SubmitterScenarioTable
# only show scenarios that have been reviewed and published, or scenarios that the user submitted.
# self.table_data = self.table_data.filter(Q(is_reviewed=True) | Q(submitter = request.user)).order_by("-id")
self.form_class = SubmitterScenarioFilterForm
self.filterset_class = SubmitterScenarioFilter
else:
self.table_class = SubmitterScenarioTable
# only show scenarios that have been reviewed and published
# self.table_data = self.table_data.filter(is_reviewed=True).order_by("-id")
self.form_class = SubmitterScenarioFilterForm
self.filterset_class = SubmitterScenarioFilter
return super().get(request, *args, **kwargs)
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['activePage'] = 'scenarios'
return context
def get_filterset(self, *args, **kwargs):
filterset = super().get_filterset(*args, **kwargs)
# is_reviewer = self.request.user.groups.filter(name='reviewer').exists() or self.request.user.is_superuser
# qs = Scenario.objects.filter(invoice_owner__username=self.request.user).order_by('invoice_due_date')
filterset.filters['is_reviewed'].field.queryset = filterset.filters['is_reviewed'].field.queryset.filter(Q(is_reviewed=True) | Q(submitter = self.request.user))
return filterset
filters.py
class ReviewerScenarioFilter(django_filters.FilterSet):
industry_type = ModelChoiceFilter(queryset=IndustryType.objects.all(), empty_label=(''))
bribe_initiator = ModelChoiceFilter(queryset=BribeInitiator.objects.all(), empty_label=(''))
bribe_facilitator = ModelChoiceFilter(queryset=BribeFacilitator.objects.all(), empty_label=(''))
bribe_recipient = ModelChoiceFilter(queryset=BribeRecipient.objects.all(), empty_label=(''))
bribe_type = ModelChoiceFilter(queryset=BribeType.objects.all(), empty_label=(''))
levelOfAuthority = ModelChoiceFilter(queryset=LevelOfAuthority.objects.all(), empty_label=(''))
reviewer = ModelChoiceFilter(queryset=User.objects.all().filter(is_reviewer=True), empty_label=(''))
# is_reviewed = django_filters.BooleanFilter(field_name='is_reviewed', lookup_expr='True')
class Meta:
model = Scenario
form = ReviewerScenarioFilterForm
fields = {
'country',
'region',
'location',
'company_name',
'scenario_summary',
'scenario_details',
'email',
'industry_type',
'levelOfAuthority',
'industry_type',
'bribe_initiator',
'bribe_facilitator',
'bribe_recipient',
'bribe_type',
'reviewer',
'submitted_date',
'is_reviewed',
'submitter',
}
filter_overrides = {
models.CharField: {
'filter_class': django_filters.CharFilter,
'extra': lambda f: {
'lookup_expr': 'icontains',
},
},
models.EmailField: {
'filter_class': django_filters.CharFilter,
'extra': lambda f: {
'lookup_expr': 'icontains',
},
},
models.TextField: {
'filter_class': django_filters.CharFilter,
'extra': lambda f: {
'lookup_expr': 'icontains',
},
},
}
tables.py
class ReviewerScenarioTable(tables.Table):
class Meta:
model = Scenario
attrs = {"class": "table table-hover table-striped table-bordered"}
#Clickable Row - Add class clickable-row and data-href=url
row_attrs = {
'data-href': lambda record: record.get_absolute_url,
'class': 'clickable-row',
}
fields = (
"id",
"country",
"company_name",
"industry_type",
"scenario_summary",
"bribe_type",
"bribe_initiator",
"bribe_facilitator",
"bribe_recipient",
"levelOfAuthority",
"submitted_date",
"first_occurence",
"resolution_date",
"email",
"reviewer",
'is_reviewed',
)
exclude = (
"scenario_details",
"risks",
"resolution",
"bribe_initiator_other",
"bribe_facilitator_other",
"bribe_recipient_other",
"bribed_by",
"bribe_type_other",
"industry_type_other",
"reviewed_date",
"submitter",
"anonymous",
"is_training_scenario",
)
def render_id(self, value, record):
return value
【问题讨论】:
标签: python django filter django-tables2 django-filters