在 Django 模板中创建排序选项

Posted

技术标签:

【中文标题】在 Django 模板中创建排序选项【英文标题】:Create Sorting Options in Django Template 【发布时间】:2016-07-03 05:19:42 【问题描述】:

我是 Django 新手,需要一些帮助。我的数据库条目显示在模板上(6 个条目)。我知道要对数据库对象进行排序,您需要在views.py 中写入Model_Name.objects.all().order_by('Choose_Sort_Option')。我想让这个函数成为同一个模板中的链接。到目前为止,我唯一能想到的就是创建一个新视图、新 url 模式和新模板来显示一种新类型。我不想仅仅为了排序而制作 30 页。我在想我需要将上面的那行代码分配给一个变量(参见下面的product dproduct_a)。然后我会在模板中调用该变量,但我不确定如何替换现有的数据库项目列表。简而言之:如何创建可点击的链接来对同一模板中的所有数据库对象进行排序。这已经在管理员中完成。谢谢!

我的意见.py:

from django.http import Http404, HttpRequest
from django.contrib import messages
from vendor_db.models import Itemo
from django.db.models import Q
from django.shortcuts import HttpResponse, HttpResponseRedirect,
render_to_response, render, redirect, get_object_or_404

def index(request):
    return render(request, 'vendor_db/index.html')

def vendors(request):
    items = Itemo.objects.all()
    var_2 = request.GET.get("q")
    product_d = Itemo.objects.all().order_by('-Product_Name')
    product_a = Itemo.objects.all().order_by('Product_Name')
    if var_2:
        items = items.filter(Vendor_Name__icontains=var_2)

    context = 'items': items,
    'product_d' :product_d,
    'product_a' :product_a,
    

    return render(request, 'vendor_db/vendors.html', context)

我的模板(它已经以任意顺序显示了我的所有数据库对象):

% extends "base.html" %
% block content %
% load static %

    <h2>All Vendors</h2>
    <h3>Search</h3><div>
    <form method='GET' action=''>
        <input type='text' name="q" placeholder='Search Vendors'/>
        <input type='submit' value='Search'/>
            <form action="% url 'vendors' %"> 
                <input type="submit" value="Reset">
            </form>
    </form>
    <br>
% if items %
        % for stuff in items %    
            <a href="% url 'vendors_detail' stuff.id %">
             stuff.Product_Name|capfirst <div></div>
            </a>
        % endfor %
% else %
    <p>No Results Found</p>
% endif %

        <h3>Sort by:</h3>
        <a href="% url 'product_name_asc' %">Product Name</a>        
% endblock %

编辑 虽然我确信下面的 2 个答案可以解决问题,但我无法理解(我自己的错)。我将我的数据库条目放在一个表中,并使用javascript library 来更改排序顺序,只需单击列标题即可。你可以看到我问的问题和代码here

【问题讨论】:

【参考方案1】:

您可以使用带有变量的表单,如您所说,将表单传递回同一视图并从中获取排序选项,然后动态或使用 if 语句为您的产品项目创建排序查询。然后重新渲染页面。这意味着只需要一个视图。

或者您可能对名为 django-tables2 的应用感兴趣,它使您能够呈现一个漂亮的表格,然后可以通过单击箭头按您希望的方式对其进行排序。

【讨论】:

使用表单不会创建不必要的字段吗?我只想显示模型条目。表单将如何改变我当前的布局?最后,我知道如何重定向到同一页面,但我不确定如何替换之前存在的数据库内容。如果你能提供一些伪代码,它可能会帮助我理解它。再次感谢您的帮助!【参考方案2】:

在你的 model.py 类中使​​用

Class XYZ()
   ...................
   ...................

   class Meta:
       ordering = [
                "your_first_field_name",
                "your_second_field_name",
                ........................
            ]

【讨论】:

这确实让我可以准确地选择我想要的订购方式,但这不是默认的订购方式吗?我想把这个功能变成一个选项,一个可点击的选项。我很抱歉,因为我对 Django 的了解还不够,不知道我可以用这个元类做什么。

以上是关于在 Django 模板中创建排序选项的主要内容,如果未能解决你的问题,请参考以下文章

在 Xcode 中创建自定义模板 - 如何根据复选框制作所需的选项?

使用 mptt 在 Python / Django 中创建 JSON 以反映树结构的最快方法

如何使用 CBV 在我的所有 Django 模板中创建侧边栏?

如何从 django 的表单中获取数据?

Django模型中的下拉列表

django:使用 Jinja if 语句在模板上显示锚链接