在django admin中过滤下拉列表值

Tau*_*uir 14 python django django-models django-admin

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)
Run Code Online (Sandbox Code Playgroud)

在Django admin add_view中:

def add_view(self, *args, **kwargs):
    self.exclude = ("added_on",)
    self.readonly_fields = ()
    return super(Bar, self).add_view(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)

因此,在admin添加视图中显示的字段是foo哪个是下拉列表并显示所有标题.一些titleFoo保持为空或"".因此,下拉列表有很多空值,因为它的标题是空的.我想过滤掉那些空值.

Pil*_*ill 23

您可以为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
Run Code Online (Sandbox Code Playgroud)

像这样......

文档


Rit*_*esh 5

对于Django 1.6:

对于外键:https : //docs.djangoproject.com/zh-CN/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)
Run Code Online (Sandbox Code Playgroud)

  • 这是适当的答案 (2认同)
  • 更新链接:https://docs.djangoproject.com/en/1.11/ref/contrib/admin/#django.contrib.admin.ModelAdmin.formfield_for_foreignkey (2认同)