在Django Admin中过滤下拉值

21 投票
4 回答
24719 浏览
提问于 2025-04-16 20:51
class Foo(models.Model):
    title = models.TextField()
    userid = models.IntegerField()
    image = models.CharField(max_length=100)
    def __unicode__(self):
       return self.title

class Bar(models.Model):
    foo = models.ForeignKey(Foo, related_name='Foo_picks', unique=True)
    added_on = models.DateTimeField(auto_now_add=True)

在Django的管理后台添加视图中:

def add_view(self, *args, **kwargs):
    self.exclude = ("added_on",)
    self.readonly_fields = ()
    return super(Bar, self).add_view(*args, **kwargs)

这里有一个字段叫foo,它在管理后台的添加视图中显示为一个下拉列表,里面列出了所有的标题。有些Footitle是空的,或者说是''。所以这个下拉列表里有很多空值,因为它的标题没有内容。我想把这些空值过滤掉。

4 个回答

2

我在寻找一种方法来根据另一个字段的选择动态过滤下拉选项时,偶然发现了这个问题。也就是说,不是根据页面加载时预先过滤的列表。最后我找到了解决方案,是这个库:https://github.com/digi604/django-smart-selects。这个应用使用了ajax调用,可以实现多级联动过滤。对我来说,效果非常好。-希望对你有帮助

21

关于Django 1.6:

如果你想使用外键(foreign key):
可以参考这个链接:https://docs.djangoproject.com/en/1.6/ref/contrib/admin/#ModelAdmin.formfield_for_foreignkey

class MyModelAdmin(admin.ModelAdmin):
def formfield_for_foreignkey(self, db_field, request, **kwargs):
    if db_field.name == "title":
        kwargs["queryset"] = Foo.objects.filter(title__isnull=False)
    return super(MyModelAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)
26

你可以为ModelAdmin提供自己的表单,并为foo字段设置自定义的数据查询。

from django import forms
from django.contrib import admin

#Create custom form with specific queryset:
class CustomBarModelForm(forms.ModelForm):
    class Meta:
        model = Bar
        fields = '__all__'

    def __init__(self, *args, **kwargs):
        super(CustomBarModelForm, self).__init__(*args, **kwargs)
        self.fields['foo'].queryset = Foo.objects.filter(title__isnull=False)# or something else

# Use it in your modelAdmin
class BarAdmin(admin.ModelAdmin):
    form = CustomBarModelForm

大概是这样的……

文档链接

撰写回答