【问题标题】:Ordering the contents of a Django filter dropdown control排序 Django 过滤器下拉控件的内容
【发布时间】:2021-09-03 07:37:43
【问题描述】:

我有一个 Django 过滤器,它按预期工作,允许通过选择下拉控件中的项目来过滤列表,但是当它呈现时,下拉控件项目按照它们进入数据库的顺序排列,这也是意料之中。

但是,这对用户不友好,因为很难找到所需的项目。我试图弄清楚如何以 alpha 顺序对下拉控件(composer)中显示的项目列表进行排序。任何帮助将不胜感激,因为我是所有这一切的新手。过滤器代码如下。我想我可能需要操作一个小部件,但不确定......

class PieceFilter(django_filters.FilterSet):

    class Meta:
        model = Piece
        fields = ['composer', 'instrumentation']
        exclude = ['title', 'description',
                   'study_notes', 'score_file', 'purchase_from', 'genre']

过滤器呈现两个用于过滤的下拉控件:“composer”(需要按 alpha 顺序排列)和“instrumentation”。在模板上,以下代码呈现一个按钮,用于从下拉控件中搜索所选项目。

 <form method="get">
    {{myFilter.form}}
    <button class="btn btn-primary" type="submit">Search</button>
  </form>

正在使用的视图:

def library(request):
    pieces = Piece.objects.all().order_by('composer__name', 'instrumentation')

    p = Paginator(pieces, 10)

    print('NUMBER OF PAGES')
    print(p.num_pages)

    page_num = request.GET.get('page', 1)
    try:
        page = p.page(page_num)
    except EmptyPage:
        page = p.page(1)

    myFilter = PieceFilter(
        request.GET, queryset=pieces)
    pieces = myFilter.qs

    piece_count = pieces.count()
    context = {'myFilter': myFilter,
               'piece_count': piece_count, 'pieces': pieces}
    return render(request, 'video/library.html', context)

【问题讨论】:

  • Piece.composerForeignKey 吗?你能在作曲家模型中添加默认排序吗?
  • 是的,Piece.composer 是一个外键。我不知道如何将默认排序添加到作曲家模型,但我会搜索 - 谢谢
  • 它没有用。我已经有作曲家订购的清单。它是需要排序的值的默认过滤器下拉控件列表
  • @IainShelvington 我很抱歉!通过向 Composer 模型添加默认排序,它确实可以完美运行。我愚蠢地将它添加到 Pieces 并想知道为什么它不起作用。感谢您的帮助。

标签: python django django-models django-filters


【解决方案1】:

对于自定义排序,您可以使用 ModelChoiceFilter

文档:https://django-filter.readthedocs.io/en/stable/ref/filters.html#modelchoicefilter

from django_filters import ModelChoiceFilter

class PieceFilter(FilterSet):

    composer = ModelChoiceFilter(queryset=Composer.objects.all().order_by('name'))

    class Meta:
        model = Piece
        fields = ['composer', 'instrumentation']

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-16
    相关资源
    最近更新 更多