在 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 d
和product_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 以反映树结构的最快方法