【问题标题】:filtering dropdown values in django admin在 django admin 中过滤下拉值
【发布时间】:2011-09-28 17:16:00
【问题描述】:
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 管理员 add_view 中:

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

因此,管理员添加视图中的字段显示为foo,这是一个下拉列表并显示所有标题。 Foo 中的一些 title 保持为空或“”。所以,下拉列表有很多空值,因为它的标题是空的。我想过滤掉那些空值。

【问题讨论】:

    标签: python django django-models django-admin


    【解决方案1】:

    您可以为 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
    

    这样的……

    docs

    【讨论】:

    • 如何使用模型的属性进行过滤?
    • 注意,这只会影响更改页面上的下拉值,而不影响更改列表页面上的过滤器。
    • 这里有get_changelist_form方法
    • 对于 django 1.8+,将 fields 属性添加到元类,如 fields = '__all__'
    • 如何根据插入到另一个管理字段中的值进行过滤?
    【解决方案2】:

    对于 django 1.6:

    对于外键: 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)
    

    【讨论】:

    【解决方案3】:

    我在寻找解决方案以根据 另一个字段中的选择 而不是基于页面加载时预先过滤的列表。我找到的解决方案是这个库:https://github.com/digi604/django-smart-selects,这是一个使用 ajax 调用并允许链式过滤到多个级别的应用程序。对我来说就像一个魅力。 -HTH

    【讨论】:

      【解决方案4】:

      您可以继承您自己的 model.ModelAdmin 并为您的 ChoiceField 创建一个自定义字段...

      class CustomForm(model.ModelForm):
      
          class Meta:
              model = Foo
      
          foo = forms.ChoiceField(widget=forms.Select, initial=self.foo_queryset)
      
          def foo_queryset(self):
              return Foo.objects.filter(xy)...
      
      class FooAdmin(model.ModelAdmin):
          form = CustomForm
      

      【讨论】:

      • 字段定义的上下文中没有self
      猜你喜欢
      • 2014-02-25
      • 2012-10-18
      • 2014-01-30
      • 2012-06-29
      • 1970-01-01
      • 2014-07-03
      • 1970-01-01
      • 2017-11-06
      • 2010-09-15
      相关资源
      最近更新 更多