【问题标题】:django days-of-week representation in model模型中的 django 星期几表示
【发布时间】:2011-08-23 10:10:16
【问题描述】:

我正在构建这个“工作服务器”模型。我想包含一个字段,该字段将保存该作业将在一周中的哪几天运行。最终在 UI 中,我希望用户能够选择一系列复选框(每天一个)。在我的模式中表示这种“星期几”数据的最佳方式是什么?

class Job(models.Model):
    name = models.CharField(max_length=32, unique=True)
    package = models.ForeignKey(Package)
    binary = models.ForeignKey(Binary)
    host = models.ForeignKey(Host)
    colo = models.ForeignKey(Location)
    group = models.ForeignKey(Group)
    type = models.ForeignKey(Type)
    start = models.TimeField()
    end = models.TimeField()
    days = ?

【问题讨论】:

    标签: django django-models model days


    【解决方案1】:

    您可能想要创建 DayOfTheWeek 字段类型,您可以通过各种方式对其进行改进。

    此代码使用多语言工具自动翻译成当地语言。

    #myFields.py
    from django.utils.translation import ugettext as _
    
    DAY_OF_THE_WEEK = {
        '1' : _(u'Monday'),
        '2' : _(u'Tuesday'),
        '3' : _(u'Wednesday'),
        '4' : _(u'Thursday'),
        '5' : _(u'Friday'),
        '6' : _(u'Saturday'), 
        '7' : _(u'Sunday'),
    }
    
    class DayOfTheWeekField(models.CharField):
        def __init__(self, *args, **kwargs):
            kwargs['choices']=tuple(sorted(DAY_OF_THE_WEEK.items()))
            kwargs['max_length']=1 
            super(DayOfTheWeekField,self).__init__(*args, **kwargs)
    
    #models.py
    import myFields
    (..)
        dayOfTheWeek = myFields.DayOfTheWeekField()
    (..)
    

    【讨论】:

    • 我看到有反对者,我很好奇为什么这不能有效地回答问题。
    • 可能是因为您正在导入 SmallIntegerField 却扩展了 models.CharField
    • 我认为走这条路意味着javascript不会有任何额外的东西?我正在处理一周中的几天的下拉列表,我需要在渲染用户数据时按星期几对其进行排序
    • @abhivemp 实际上,不需要 javascript。有两个文件受到影响。
    • @MUYBelgium 你知道是否可以在 jinja 模板上呈现星期几的标签(例如,“星期一”)而不是“1”?如果是这样,我会怎么做?
    【解决方案2】:

    这样的事情会奏效。

    #models.py
    DAYS_OF_WEEK = (
        (0, 'Monday'),
        (1, 'Tuesday'),
        (2, 'Wednesday'),
        (3, 'Thursday'),
        (4, 'Friday'),
        (5, 'Saturday'),
        (6, 'Sunday'),
    )
    
    days = models.CharField(max_length=1, choices=DAYS_OF_WEEK
    
    #forms.py
    widgets = { 'days': forms.CheckboxSelectMultiple }
    

    或保存多天

    #models.py
    class Days(models.Model):
        day = models.CharField(max_length=8)
    
    days = models.ManyToManyField(Days)
    
    #forms.py
    widgets = { 'days': forms.CheckboxSelectMultiple }
    

    【讨论】:

    • 我删除了我的 cmets。由于某种原因,页面存在错误,并且您的小部件部分不断消失。
    • 啊,反正我给了你+1。很好的答案。
    • 这只能让我设置和存储一周中的一天。我需要它来容纳多天。 :-(
    • 在这种情况下,创建一个 Days 模型,并对其进行 M2M 字段
    • 或者您可以尝试使用 models.MultipleChoiceField 而不是 CharField。喜欢这里:stackoverflow.com/questions/746173/…
    【解决方案3】:

    如果您想要为每个复选框设置一个复选框,那么最简单的方法是为每个复选框创建 BooleanFields。如果您想将其存储为更复杂的值(例如逗号分隔列表或其他内容),请创建自己的小部件并使用 javascript,那么您可以走这条路。

    【讨论】:

      【解决方案4】:

      刚刚实现django-weekday-field。效果很好! 希望这可以帮助其他偶然发现这个问题的人

      编辑:自从 bitbucket 存储库被删除后更新了 pypi 的链接。

      它自 2014 年以来一直没有更新,但查看代码是开始回答这个问题的好方法

      【讨论】:

      • 点击该链接时为 404
      • Bitbucket 链接得到 404,pypi 包自 2014 年以来没有更新
      • 这也不行
      • @NobinPegasus 这是一个非常无用的评论,至少说明它为什么不起作用。如果你真的阅读了我的评论并查看了 repo,你会发现它自 2014 年以来就没有更新过......所以当然它可能不再有效
      猜你喜欢
      • 2022-11-23
      • 1970-01-01
      • 2019-11-16
      • 1970-01-01
      • 2022-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多