【问题标题】:Django: Iterating over multiple instances of a single model in a viewDjango:在视图中迭代单个模型的多个实例
【发布时间】:2013-06-28 19:00:18
【问题描述】:

我对 Django 比较陌生,遇到了一个我还无法解决的问题:
我有两个模型,看起来像:

class Item(models.Model):
    char1 = models.CharField(max_length=200)
    char2 = models.CharField(max_length=200)

class Entry(models.Model):
    item = models.ForeignKey(Item)
    choice = models.IntegerField()

我在我的数据库中存储了许多项目,我希望基本上在一个视图中随机迭代所有存储的项目,并且为每个项目显示 char1 和 char2 以及一个 IntegerField 和一个“下一步”按钮,存储一个新的在我的数据库中输入(带有实际项目和键入的整数)并将我引导到下一个(随机)项目。

在研究过程中,我发现了例如表单向导和表单集,但这不是我想要的,向导需要多个表单模型,他可以连续显示,但我想(随机)显示只有一个模型的每个实例(项)并为每个项存储一个条目。

我希望有人能给我提示在哪里寻找,因为我在任何地方都找不到此用例的文档/教程,而且由于我对 Django 不是很有经验,所以我现在无法弄清楚...

提前致以最诚挚的问候和感谢!

【问题讨论】:

  • “随机遍历所有存储的项目”是什么意思?
  • 我存储了 3 个项目,项目 1,项目 2,项目 3。每当我调用该站点时,它都会以不同的顺序显示所有项目,例如在第一次调用时:item2、submit、item3、submit、item1。在下一次通话中,例如item1 首先显示。

标签: python django django-models


【解决方案1】:

从您的标题来看,问题在于从单个(可能是随机/未排序的)模型中迭代多个项目。

如果我没记错的话,您要查找的是Pagination。从该文本中,一个小例子是:

>>> from django.core.paginator import Paginator
>>> objects = ['john', 'paul', 'george', 'ringo']
>>> p = Paginator(objects, 2)

>>> p.count
4
>>> p.num_pages
2
>>> p.page_range
[1, 2]

尽管上面显示了一个列表,Paginator 也可以在 Django QuerySets 上使用,它的功能并入 Django 模板中。

如果这不是你想要的,请告诉我。

欢呼。

【讨论】:

  • 嘿,非常感谢,我想这可能正是我需要的,不知道为什么我没有到达那里并坚持使用表格和向导.. 我会的试试这个!
  • 没问题!有时,找出您需要查看的事物的名称可能与查看它一样棘手。
  • 对。我测试了它,这就是我想要的,再次感谢!但是还有一个问题,我现在可以为我展示的每个页面创建一个新的 Entry 对象并在用户提交一些数据后将其保存到我的数据库中吗?
  • 没有理由不能组合表单和分页,只要您的视图、模型和模板设置为这样做。试试看,如果卡住了,就回来吧!
【解决方案2】:

Paulo Bu 的回答首先提供了从 Django 的 AP 获取随机排序的方法。您正在做的事情的棘手部分是,在页面加载之间保存项目的特定随机顺序并不是真正的RESTful,因为这不是无状态的。默认情况下,您的随机排序的查询集将在您处理请求后立即消失,并且无法保证您将循环通过所有项目而不是重复和遗漏。因此,您需要保存该排序。有很多选项可以帮助您解决这个问题:

  1. 为每个请求提供整个随机项目 ID 列表,并让后端按索引提供当前项目的数据
  2. 提供所有数据 - 完整的项目和条目 - 然后您可以在客户端呈现所有内容
  3. 将随机列表存储为会话变量
  4. 通过向每个项目添加一个介于 0 和 1 之间的浮点数、在该浮点数上排序并从随机索引开始(如果您不关心每个用户是否具有相同的整体排列)来存储项目的永久随机排序

【讨论】:

  • 好的,谢谢您提供这些信息!我认为第 4 点已经过时,因为每个用户获得不同的排列也很重要。但是第 1 到第 3 点看起来不错,谢谢!我一定会试试的!
猜你喜欢
  • 2011-01-01
  • 1970-01-01
  • 2018-09-12
  • 2014-08-15
  • 1970-01-01
  • 2018-12-04
  • 1970-01-01
  • 2023-03-16
  • 1970-01-01
相关资源
最近更新 更多