【问题标题】:Create Sorting Options in Django Template在 Django 模板中创建排序选项
【发布时间】: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

【问题讨论】:

    标签: python django django-templates django-admin django-views


    【解决方案1】:

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

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

    【讨论】:

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

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

    Class XYZ()
       ...................
       ...................
    
       class Meta:
           ordering = [
                    "your_first_field_name",
                    "your_second_field_name",
                    ........................
                ]
    

    【讨论】:

    • 这确实让我可以准确地选择我想要的订购方式,但这不是默认的订购方式吗?我想把这个功能变成一个选项,一个可点击的选项。我很抱歉,因为我对 Django 的了解还不够,不知道我可以用这个元类做什么。
    猜你喜欢
    • 1970-01-01
    • 2012-01-13
    • 2011-09-26
    • 2017-11-20
    • 1970-01-01
    • 1970-01-01
    • 2016-08-11
    • 2013-03-25
    • 2018-02-04
    相关资源
    最近更新 更多