我想把我的django-filter字段變成下拉菜單。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)))
它的工作原理!然而,不是返回願望列,而是返回title
提交給所有的Django表單字段。這是來自我的模型。
def __str__(self):
return self.title
使用簡單的Django模型表單時可以觀察到相同的行爲。在這種情況下,我只是重寫ModelChoiceField
類label_from_instance
功能是這樣的:
class CategoryModelChoiceField(ModelChoiceField):
def label_from_instance(self, obj):
return obj.category
我的問題是如何覆蓋ModelChoiceFilter
?或者可能有另一個方便的方法來實現Django過濾器的下拉菜單?
UPDATE
由於djnago過濾用的下拉列表中的默認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', ]