我是Django的新手,所以如果答案显而易见,请原谅这个问题。我已经挣扎了好几天,终于找到了解决办法,但我确信必须有更好的方法。简而言之,问题是:我正在构建一个Django网站,列出各种主题的书籍。主列表应该按作者的字母顺序排列,这一部分很容易。称之为"垂直排序"。然而,相当多的书有多个作者,并且给定书的作者顺序是而不是字母顺序:它可以是任何东西,例如,作者B和作者a,而不是作者a和作者B。称之为"水平排序">
问题是Django表单的默认SelectMultiple小部件允许您选择多个项目,但不允许您指定顺序。它总是按字母顺序出现。我找到了一种方法来强制我想要的排序,但这产生了破坏垂直排序的不良效果。
以下是我的出版物模型的一个片段:
class Publication(models.Model):
"""A class to define publication fields"""
author = models.ManyToManyField(Author, related_name='publications')
title = models.CharField(max_length=200)
[snip...]
其中Author模型(未显示(按lastName、firstName 的字母顺序排序
在视图.py中,我正在这样做:
def dbBib(request):
"""Show all Publications"""
pubs = Publication.objects.all().order_by('author')
[snip...]
当发送到模板时,这种组合会生成一个按作者(垂直(排序的图书目录列表,但其中一些图书作者的排列顺序错误。
我修复水平排序的第一次尝试是在模型中添加一个新字段;author_sorting;所以如果我输入";2,3,1〃;,例如,它将导致指定的作者B、作者C、作者A的作者排序,而不是默认的A、B、C。这很有效,但破坏了垂直排序,因为视图仍然像作者A在列表中第一个一样排序。
我对这个问题的解决方案是在模型中添加另一个字段,";第一作者;其中,我指定了第一作者,并将其用作views.py中的排序字段。但现在,除了在SelectMultiple控件和前面提到的author_sorting字段中输入完整作者列表外,我还必须在输入数据时添加另一个属性。这是有效的,但必须有一个更简单的方法!!
一路上,我不得不想出另一个杂烩来删除重复的列表(或者当有三个作者时是三个列表,等等(,但这是另一天的话题。。。