【问题标题】:In Django admin, how can I filter a MultipleChoiceField depending on a previous MultipleChoiceField?在 Django admin 中,如何根据先前的 MultipleChoiceField 过滤 MultipleChoiceField?
【发布时间】:2021-01-24 19:14:34
【问题描述】:

在我的 django 网站中,我有 3 个类:Thing、Category 和 SubCategory。 Thing 有 2 个 ForeignKey:“Category”和“SubCategory”(例如 Car 和 Ferrari)。 SubCategory 有 1 个 ForeighKey:“Category”(法拉利属于 Car 类别)

当我在管理部分创建事物的实例并选择类别时,我希望“子类别”字段仅显示链接到我选择的类别的子类别。这可能吗?

我看到了像这样更改 AdminForm 的可能性:

class ThingFormAdmin(forms.ModelForm):
    def __init__(self,Category,*args,**kwargs):
        super (ThingFormAdmin,self ).__init__(*args,**kwargs) # populates the post
        self.fields['sub_category'].queryset = SubCategory.objects.filter(category= ... )

但我不知道在上面写什么...

感谢您的帮助!

【问题讨论】:

    标签: django django-admin


    【解决方案1】:

    一般来说,这个解决方案总是可行的: 您需要一些 javascript 来捕捉已选择的第一个选择。然后使用 javascript 过滤 agin。

    但在 django admin 中,有 autocomplete_fields 可用。使用它会创建一种选择输入,当用户键入某些字符时,它使用 ajax 对选择进行一些魔术过滤。它使用相关模型 admin.ModelAdmin 类的get_search_results 方法。覆盖该方法并为该方法提供一些额外的数据可能会有所帮助。但这是最长的步行方式。

    【讨论】:

      【解决方案2】:

      谢谢!我会在第二个答案之后再看第一个答案,因为我不必写 JS 非常好,因为我在其中非常糟糕。

      我设法使用autocomplete_field 工作,但我坚持重新定义get_search_results 方法。如果我正确理解了文档,它将类似于:

      def get_search_results(self, request, queryset, search_term):
              queryset, use_distinct = super().get_search_results(request, queryset, search_term)
              try:
                  cat = search_term
              except ValueError:
                  queryset |= self.model.objects.all()
              else:
                  queryset |= self.model.objects.filter(category=cat)
              return queryset, use_distinct    
      

      但我不明白这个search_term 来自哪里,以及如何指定它。有什么想法吗?

      【讨论】:

        【解决方案3】:

        【讨论】:

          猜你喜欢
          • 2019-10-12
          • 1970-01-01
          • 2012-03-18
          • 2013-04-03
          • 1970-01-01
          • 1970-01-01
          • 2017-09-28
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多