【问题标题】:Using Django sessions to set a user-like field on a model使用 Django 会话在模型上设置类似用户的字段
【发布时间】:2013-12-21 19:25:11
【问题描述】:

我正在编写一个小应用程序来向一群学生展示拍卖。我希望每个学生能够对几个(超过 1 个,少于 10 个)项目进行投标,然后向他们展示每个项目的投标分布。我想确保每个人只对每个项目进行一次出价。 (这些都是青少年,我敢肯定有人会试图通过对每个项目提交 10 个不同的投标来制造麻烦。)

我希望每个用户都能看到他们对任何他们出价的项目的当前出价值。我想让他们修改他们的出价(在一段时间内)。为此,我需要一些方法来为单个用户标记出价(因此他们只能查看/编辑自己的出价)。模型看起来像这样:

from django.db import models

class Lot(models.Model):
    name = models.CharField(max_length=200)
    description = models.TextField()
    openforbids = models.BooleanField(default=False)

    def __unicode__(self):
        return u'%s' % self.name

class Bid(models.Model):
    lot = models.ForeignKey('Lot')
    amount = models.FloatField()
    bidderid = **something goes here**

    def __unicode__(self):
        return u'Bid on lot %d' % self.lot

所以问题是,bidderid 字段在Bid 模型中应该采用什么形式?

  • 我可以做一个完整的User 模型,并要求每个学生在讲座开始时注册。然后将bidderidForeignKey 变成User。这似乎有点多。我宁愿不实现注册页面或强制他们使用密码。
  • 我可以将bidderid 设为CharField 并让每个学生输入一些内容。但这并没有提供每个人对各种项目的出价之间的任何联系。我会在(lot, bidderid) 元组上设置unique_together 约束,但这不会阻止学生通过多次组成新的bidderid 字符串来简单地进行多次投标。
  • 我可以将bidderid 设为CharField,但随后会自动填充来自request.session 的信息。

我想走第三条路线并使用sessions 自动为使用该应用程序的每个人提供一个唯一的ID。我已经尝试在 Django 中阅读sessions,但对我将如何做到这一点还没有很好的理解。我只想为Bid 模型实现一个自定义save 方法,它将bidderid 设置为session 的一些独特之处。我该怎么做?我应该使用的唯一会话标识符的名称是什么?通常,您如何实现这样的事情,以便在您尝试从控制台创建模型实例时它们不会破坏块。 IE。如果我实现一个设置self.bidderid = something.from.request.sessionsave 方法,那么当我尝试从没有request 对象的控制台保存bid 实例时会发生什么?

同样,如果我想让学生将他们的名字与出价相关联,那么在上述会话驱动框架中执行此操作的好方法是什么?理想情况下,当他们进入主页时,他们会看到一个询问“你叫什么名字”的表单字段。当他们提交它时,我会在 SessionName 模型中存储一行,该模型有两个字段:

class SessionName(models.Model):
   sessionid = **the unique thing from request.session that we use to ID users**
   chosenname = models.CharField() # the value they submit in the form

然后在整个应用程序中,我们可以将会话中的出价与他们在讲座开始时输入的chosenname 相关联。这有意义吗?

【问题讨论】:

    标签: python django session django-sessions


    【解决方案1】:

    解决方案可以是为学生预生成所需数量的用户帐户,并在讲座开始时分发用户名/密码。现在的青少年对此很熟悉,因此无需为自己使事情变得比必要的更复杂。实现功能以让用户在登录后填写他们的姓名并存储该姓名。然后,您可以允许学生出价并显示他们的姓名。

    这种方法将出价与用户帐户相关联,并防止出现过时会话等混乱情况。讲座结束后,您可以保留或删除数据,然后重新开始下一场讲座。这也意味着您可以强制执行限制条件,例如少于 10 个出价,并且能够在有限的时间内编辑出价(例如,将出价存储在您的数据库中的时间)。

    【讨论】:

    • 真的不想走“为每个用户进行真正的登录”路线。它会减慢速度,一些学生可能不会费心去尝试这个有任何减速带的网站。您能建议继续使用sessions 路线的最佳方式吗?
    猜你喜欢
    • 1970-01-01
    • 2017-06-15
    • 1970-01-01
    • 2023-03-21
    • 2013-04-23
    • 1970-01-01
    • 2021-11-16
    • 2019-04-15
    • 1970-01-01
    相关资源
    最近更新 更多