代码之家  ›  专栏  ›  技术社区  ›  Jordan Reiter

是否可以自定义自定义模板中自定义模型字段的值的显示方式?

  •  0
  • Jordan Reiter  · 技术社区  · 15 年前

    我将日期存储为格式为YYMMDD的整数字段,其中月份或日期是可选的。

    我有以下格式化数字的功能:

    def flexibledateformat(value):
        import datetime, re
        try:
            value = str(int(value))
        except:
            return None
        match = re.match(r'(\d{4})(\d\d)(\d\d)$',str(value))
        if match:
            year_val, month_val, day_val = [int(v) for v in match.groups()]
        if day_val:
            return datetime.datetime.strftime(datetime.date(year_val,month_val,day_val),'%b %e, %Y')
        elif month_val:
            return datetime.datetime.strftime(datetime.date(year_val,month_val,1),'%B %Y')
        else:
            return str(year_val)
    

    其结果如下:

    >>> flexibledateformat(20100415)
    'Apr 15, 2010'
    >>> flexibledateformat(20100400)
    'April 2010'
    >>> flexibledateformat(20100000)
    '2010'
    

    所以我想知道在model field类下是否有一个函数可以自动调用 flexibledateformat .

    所以如果有记录 R=数据记录(name='foo',date=20100400) 当以形式处理时,值将 20100400 但在模板中输出时使用 {{ r.date }} 它显示为“2010年4月”。

    进一步澄清

    我通常使用date time来存储日期/时间值。在这种情况下,我需要记录 非特定日期 : X 发生在2009年“, Y 发生在1996年6月的某个时候。

    最简单的方法是在保留日期字段的大部分功能(包括排序和筛选)的同时,使用以下格式的整数: yyyymmdd . 这就是为什么我使用 IntegerField 而不是 DateTimeField .

    这就是我希望发生的事情:

    1. 我存储我所说的“灵活” 在A中的日期 FlexibleDateField 作为一个 带格式的整数 出生年月日 .
    2. 我呈现一个包含 flexibledateField和值 保持整数,以便函数 验证它所必需的 在小部件工作中呈现它 正确地。
    3. 我称之为模板, 如object.flexibledate和 它是根据 灵活日期格式规则: 20100416 ->2010年4月16日; 二千零一十万零四百 ->2010年4月; 20100000 -gt;2010。这个 也适用于我不打电话的时候 直接,例如当它被用作 管理中的标题 ( http://example.org/admin/app_name/model_name/ )

    我不知道这些具体的事情是否可行。

    阿尔索

    我已经编写了一个模板过滤器,可以执行此功能-- ( {{object.flexibledate|flexibledateformat}} ———— 但我不想每次输出这些值时都调用过滤器。除了输出表单时,我几乎不想看到数字。

    2 回复  |  直到 15 年前
        1
  •  2
  •   Ludwik Trammer    15 年前

    我认为最 丹吉欧什 实现类似效果的方法是在模型上定义自定义方法:

    class Model(models.Model):
        date = models.IntegerField()
        ...
    
        def flexibledate(self):
            return flexibledateformat(self.date)
    

    您可以在这样的模板中使用它:

    {{ r.flexibledate }}
    

    我还想知道为什么您要使用integerfield而不是本地的datetimefield。

    更新: 您仍然可以使用自定义方法作为 list_display 在Django管理。如果您想让列标题说些别的话,那么只需使用方法名的“short_description”选项,如下所示:

    class Model(models.Model):
        date = models.IntegerField()
        ...
    
        def flexibledate(self):
            return flexibledateformat(self.date)
        flexibledate.short_description = 'Date'
    

    然后用普通字段的同样方法使用它:

    class YourModelAdmin(admin.ModelAdmin):
        list_display = ('title', 'flexibledate')
    admin.site.register(YourModel, YourModelAdmin)
    
        2
  •  -1
  •   diegueus9    15 年前

    那不是必要的,读一下 humanize 过滤标签 time