django-filter下拉菜单

时间:2017-02-08 19:12:39

标签: django 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))) 

有效!但是,它不是返回所需的列,而是返回在所有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', ]

2 个答案:

答案 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)
)