python - 表单在 django_filters 模板中不可用

标签 python django forms debugging django-filter

我正在尝试构建数据过滤分页页面。这是我的过滤器

from shop.models import CC
import django_filters

name_values = [("", "---------")] + list(CC.objects.values_list('name', 'name').distinct())
city_values = [("", "---------")] + list(CC.objects.values_list('city', 'city').distinct())


class CCFilter(django_filters.FilterSet):
    name = django_filters.ChoiceFilter(choices=name_values)
    city = django_filters.ChoiceFilter(choices=city_values)

    class Meta:
        model = CC
        fields = {
            'name': ['exact'],
            'city': ['exact'],
        }

查看:

@method_decorator(login_required, name='dispatch')
class BuyView(ListView):
    paginate_by = '25'
    queryset = CC.objects.all()
    context_object_name = "ccs"
    template_name = "buy.html"

    def get_queryset(self):
        queryset = super(BuyView, self).get_queryset()
        queryset = CCFilter(self.request.GET, queryset)
        return queryset

    def get_context_data(self, **kwargs):
        context = super(BuyView, self).get_context_data(**kwargs)
        context['cart'] = Cart.objects.get(user=self.request.user)
        return context

    def get_paginate_by(self, queryset):
        """
        Paginate by specified value in querystring, or use default class property value.
        """
        return self.request.GET.get('per_page', self.paginate_by)

型号:

class CC(models.Model):
    number = models.CharField(max_length=19, unique=True)
    name = models.CharField(max_length=70)

documentation据记载,表单对象可用作模板中的上下文属性。但是当我执行 {{ ccs.form|crispy }} 时,什么也没有出现。虽然我可以使用像 ?name=christian 这样的 get 请求来过滤数据,但它效果很好。但我如何访问表单?

最佳答案

文档显示您可以编写 View 并将过滤器手动传递给模板,或者使用内置的FilterView。您当前正在使用 Django 的 ListView,因此除非您显式执行,否则过滤器不会传递到模板。

您可以尝试更改 View 以使用 FilterView 代替。它看起来像这样。为了简单起见,我省略了分页代码。

from django_filters.views import FilterView

@method_decorator(login_required, name='dispatch')
class BuyView(FilterView):
    filterset_class = CCFilter
    template_name = "buy.html"
    context_object_name = "ccs"

    def get_queryset(self):
        queryset = super(BuyView, self).get_queryset()
        queryset = CCFilter(self.request.GET, queryset)
        return queryset

    def get_context_data(self, **kwargs):
        context = super(BuyView, self).get_context_data(**kwargs)
        context['cart'] = Cart.objects.get(user=self.request.user)
        return context

在模板中,您可以使用 {{ filter }} 访问过滤器,使用 {{ filter.form }} 访问表单

关于python - 表单在 django_filters 模板中不可用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37215551/

相关文章:

python - 使用 django-kombu 的其他替代方法是什么?

python - django project_form 无效?

python - Scapy 使用 Python 将数据包保存在带有时间戳的日志文件中

python - 如何将 int 值存储在 numpy.empty 数组中?

django - 使用 Django RequestFactory 时如何传递额外的关键字参数?

javascript - 如果需要,跳过验证

python - 如何通过多种形式过滤一个模型?

python - 为什么不鼓励使用多个 Tk 实例?

python - 使用 Perl/Batch/Python 更新 MS Word 文档的详细信息 "content status"

ajax - 无需重定向的 Django 远程身份验证