我知道如何使用Django创建html表单,也知道如何访问request.GET中的值。
我知道如何使用ORM:MyModel.objects.filter(...)
现在我不知道如何从request.GET获取匹配的QuerySet
我在Django文档中找不到这个。
示例:
class MyModel(models.Model):
name=models.CharField(max_length=1024)如果request.GET包含name=foo,我希望有一个像MyModel.objects.filter(name__icontains=request.GET['name'])这样的过滤器。
我可以自己编写代码,但我认为这是在重新发明轮子。这对我来说太复杂了。
上面只是一个例子。我更喜欢配置而不是编码的解决方案。
发布于 2019-12-11 23:07:40
我们可以在这里构造一个Q对象:
from django.db.models import Q
MyModel.objects.filter(
Q([('{}__icontains'.format(k), v) for k, vs in request.GET.lists() for v in vs])
)如果某个键在querystring中多次出现,这也是可行的。请注意,您查询的字段应支持 [Django-doc]查找。
此外,允许这样做可能是不安全的,因为例如黑客可能会尝试使用user__password来猜测用户的(散列)密码。
发布于 2019-12-11 23:13:08
你该这么做
filters = {}
for param, value in request.GET.items():
filters['{}_icontains'.format(param)] = value
queryset = MyModel.objects.filter(**filters)参考https://docs.djangoproject.com/en/3.0/ref/request-response/#django.http.QueryDict.items
发布于 2019-12-16 20:08:21
您可以使用django-tables2和django-filter
在这里解释:
Django-filter可用于生成类似于
管理员的list_filter界面的界面。它有一个非常类似于Django的ModelForms的API。例如,如果您有一个Product模型,您可以使用以下代码为其设置一个筛选集:
import django_filters
class ProductFilter(django_filters.FilterSet):
class Meta:
model = Product
fields = ['name', 'price', 'manufacturer']在您看来,您可以这样做:
def product_list(request):
filter = ProductFilter(request.GET, queryset=Product.objects.all())
return render(request, 'my_app/template.html', {'filter': filter})如何在django-tables2中使用django-filter,请参阅django-filter in django-table2
https://stackoverflow.com/questions/59288370
复制相似问题