【问题标题】:filter a field in a dropdown lit in django admin过滤在 django admin 中点亮的下拉列表中的字段
【发布时间】:2014-02-25 03:35:32
【问题描述】:

我有一个非常简单的 django 模型:

class Car(models.Model):
   carname = models.CharField(max_length=100)
   carmodel = models.CharField(max_length=100)
   carcountry = models.CharField(max_length=100)
   caryear = models.CharField(max_length=100)
       cardesc = models.TextField()

还有一个显示所有记录的 admin.py:

class UserForm(forms.ModelForm):
    cardesc = forms.CharField(widget=forms.Textarea(attrs={'cols': 120, 'rows': 20}))

class Meta:
    model = Cars


  class ModelAdmin(admin.ModelAdmin ):
     form = UserForm



  admin.site.register(Cars,ModelAdmin)

它工作正常。现在,我的问题是: 我想要一个下拉列表,我可以选择汽车型号,然后根据我的选择过滤我的结果...

我该怎么做?我必须编辑 Admin.py 文件? Django对此有内置功能吗?或者我必须创建一个 HTML 模板?如何?请帮帮我。

【问题讨论】:

    标签: python html django django-admin django-admin-filters


    【解决方案1】:

    你必须添加

    list_filter = ['carmodel', ]
    

    到 ModelAdmin 类。

    【讨论】:

      【解决方案2】:

      试试这个。

      class CustomForm(forms.ModelForm):
      
          class Meta:
              model = Cars
      
          cars_list = Cars.objects.values_list('carmodel', flat=True).order_by('carmodel').distinct()
          choice_list = []
          for car in cars_list:
              choice_list.append((car,car,)) 
          CAR_CHOICES = choice_list
      
          #Used 'ChoiceField' as you want dropdown list for carmodels stored in text fields 
          carmodel = forms.ChoiceField(widget=forms.Select, choices=CAR_CHOICES)
      
      class CarsModelAdmin(model.ModelAdmin):
          form = CustomForm
          list_filter = ['carmodel']
      
      admin.site.register(Cars,CarsModelAdmin)
      

      【讨论】:

        【解决方案3】:

        来自documentation

        ModelAdmin.formfield_for_foreignkey(db_field, request, **kwargs)¶
        

        ModelAdmin 上的 formfield_for_foreignkey 方法允许您覆盖外键字段的默认表单字段。例如,要根据用户返回此外键字段的对象子集:

        class MyModelAdmin(admin.ModelAdmin):
            def formfield_for_foreignkey(self, db_field, request, **kwargs):
                if db_field.name == "car":
                    kwargs["queryset"] = Car.objects.filter(owner=request.user)
                return super(MyModelAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)
        

        这使用 HttpRequest 实例过滤 Car 外键字段以仅显示 User 实例拥有的汽车。

        【讨论】:

        • 通知它仅在 1.6+ 中支持可能会有所帮助
        猜你喜欢
        • 2014-07-03
        • 2011-09-28
        • 2010-12-09
        • 2012-04-28
        • 2019-04-29
        • 1970-01-01
        • 1970-01-01
        • 2017-11-06
        • 2010-10-15
        相关资源
        最近更新 更多