我正在尝试将django-filter字段变为下拉列表。
class UserFilter(django_filters.FilterSet):
class Meta:
model = Product
fields = ['category', 'genre', 'instrument', ]
def filter(request):
filter = UserFilter(request.GET, queryset=Product.objects.all())
return render(request, 'filter.html', {'filter': filter})
我正在尝试使用ModelChoiceFilter实现这一点,如下所示:
category=django_filters.ModelChoiceFilter(queryset=Product.objects.all())
genre = django_filters.ModelChoiceFilter(queryset=Product.objects.all())
instrument=django_filters.ModelChoiceFilter(queryset=Product.objects.all)))
有效!但是,它不是返回所需的列,而是返回在所有django-form字段上提交的title
。这来自我的模特。
def __str__(self):
return self.title
使用简单的Django模型表单时可以观察到相同的行为。在这种情况下,我只是覆盖label_from_instance
类的ModelChoiceField
函数,如下所示:
class CategoryModelChoiceField(ModelChoiceField):
def label_from_instance(self, obj):
return obj.category
我的问题是如何覆盖ModelChoiceFilter
?或者可能还有另一种方便的方法来实现django-filter的下拉?
更新
由于djnago-filter默认为ForeignKeys下拉,我只是改变了我的模型。现在看起来像这样:
class Category(models.Model):
category = models.CharField(max_length=50, blank=True)
class Genre(models.Model):
genre = models.CharField(max_length=50, blank=True)
class Instrument(models.Model):
instrument = models.CharField(max_length=50, blank=True)
class Product(models.Model):
category = models.ForeignKey(Category)
genre = models.ForeignKey(Genre)
instrument = models.ForeignKey(Instrument)
title = models.TextField(max_length=200, blank=True)
def __str__(self):
return self.title
现在它改变了它的行为。它指出对象的数量,但不是实际的字符串。像这样:
Category object - Genre object - Instrument object - title1
Category object - Genre object - Instrument object - title2
Category object - Genre object - Instrument object - title3
下拉菜单本身工作正常,没有任何干预:
class UserFilter(django_filters.FilterSet):
class Meta:
model = Product
fields = ['category', 'genre', 'instrument', ]
答案 0 :(得分:1)
我终于成功了。这是工作模式:
class Category(models.Model):
category = models.CharField(max_length=50, blank=True)
def __str__(self):
return self.category
class Genre(models.Model):
genre = models.CharField(max_length=50, blank=True)
def __str__(self):
return self.genre
class Instrument(models.Model):
instrument = models.CharField(max_length=50, blank=True)
def __str__(self):
return self.instrument
class Product(models.Model):
category = models.ForeignKey(Category)
genre = models.ForeignKey(Genre)
instrument = models.ForeignKey(Instrument)
title = models.TextField(max_length=200, blank=True)
def __str__(self):
return self.title
答案 1 :(得分:0)
我使用了相同的解决方案,但有时候我想避免对模型进行完全规范化。也许我已经错过了,但我很惊讶django_filters.modelChoiceFilter不会简单地返回查询集中的任何属性,而不仅仅是外键名称。
这是另一种从查询集动态生成选择的解决方案。
import Foundation
import UIKit
UIApplicationMain(
CommandLine.argc,
UnsafeMutableRawPointer(CommandLine.unsafeArgv)
.bindMemory(
to: UnsafeMutablePointer<Int8>.self,
capacity: Int(CommandLine.argc)),
NSStringFromClass(MyApplication.self),
NSStringFromClass(AppDelegate.self)
)