使 Django forms.DateField 显示使用本地日期格式

2023-11-25

我正在尝试找到一种简单的方法来构建以澳大利亚格式(dd/mm/yyyy)显示日期的表单。这是我能找到的唯一方法。看来应该有更好的解决方案。

注意事项:

  • 创建了一个新的小部件,以 dd/mm/yyyy 格式呈现日期值
  • 创建了新的日期字段,将定位日期格式字符串添加到它尝试使用的值列表中

我想理想的解决方案是一个自动本地化的日期字段,但这对我来说不起作用(strftime似乎对unicode不友好,但我没有努力尝试)

我错过了什么吗?有更优雅的解决方案吗?这是一个稳健的方法吗?

from models import *
from django import forms
import datetime

class MyDateWidget(forms.TextInput):

    def render(self, name, value, attrs=None):

            if isinstance(value, datetime.date):
                    value=value.strftime("%d/%m/%Y")

            return super(MyDateWidget, self).render(name, value, attrs)


class MyDateField(forms.DateField):

    widget = MyDateWidget

    def __init__(self, *args, **kwargs):
            super(MyDateField, self).__init__(*args, **kwargs)
            self.input_formats = ("%d/%m/%Y",)+(self.input_formats)


class ExampleForm(ModelForm):
    class Meta: 
            model=MyModel
            fields=('name', 'date_of_birth')

    date_of_birth = MyDateField()

当然,我不是 django/python Jedi,但是......

我不认为你的做法有什么问题。这是一本干净的读物。

您可能不需要创建自己的小部件,只是为了在第一个表单显示上以正确的格式呈现日期。只需使用format参数为DateInput小部件,你应该没问题。所以在你的 MyDateField 类中我会这样做:

class MyDateField(forms.DateField):

    widget = forms.DateInput(format="%d/%m/%Y")

    def __init__(self, *args, **kwargs):
        super(MyDateField, self).__init__(*args, **kwargs)
        self.input_formats = ("%d/%m/%Y",)+(self.input_formats)

你可以使用formfield_callback(参见接受的答案对于这个遥远相关的问题),意思是:

def customize_fields(f):
    if isinstance(f, DateTimeField):
        datetime_field=forms.DateTimeField(widget=
            forms.DateInput(format='%d/%m/%Y %h:%i'))
        date_field.input_formats = ("%d/%m/%Y %h:%i",)+
            (date_field.input_formats)
        return datetime_field
    elif isinstance(f, DateField):
        date_field=forms.DateField(widget=
            forms.DateInput(format='%d/%m/%Y'))
        date_field.input_formats = ("%d/%m/%Y",)+
            (date_field.input_formats)
        return date_field
    else:
        return f.formfield()

class MyModelForm(forms.ModelForm):
    formfield_callback = customize_fields

    class Meta:
        model = ...

这样做完全消除了您的需要MyDateField类,但可能会引入 - 如果您希望每个表单类都调用customize_fields- 需要一个 ModelForm 后代,实现formfield_callback=customize_fields作为所有表单类的新基础。

我的使用问题formfield_callback机制有两个:

  1. 它的可读性较差,并且依赖于 ModelForms 内部工作原理的知识。我在任何地方都找不到有关 formfield_callback 的实际文档......

  2. 如果您需要在 ModelForm 中重新定义模型字段,例如使该字段对于表单的特定实例不需要,如下所示:

       class MyModelForm(forms.ModelForm):
           formfield_callback = customize_fields
           foo = forms.DateField(required=false)
    
           class Meta:
               model = Bar
    

    您正在覆盖customize_fields返回的表单字段,因此完全失去了自定义。

我认为你的方法更具可读性。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使 Django forms.DateField 显示使用本地日期格式 的相关文章

随机推荐

  • OpenCV 输入数组/输出数组

    我刚刚编译了 OpenCV 2 3 的最新版本 他们决定将所有 Matrix 输入 输出更改为 InputArray OutputArray 这让一切都变得混乱 在 OpenCV 2 2 下运行良好的同一段代码现在毫无价值 我可以接受两种解
  • 创建maven项目

    如何在 Eclipse 中创建一个简单的 Maven 项目 每次创建项目时都会出现错误 错误 描述 资源路径 位置类型 CoreException Could 不计算构建计划 插件 org apache maven plugins mave
  • CSRF 令牌与 Laravel sainttum 和 Angular http 不匹配

    我一直在尝试实现 Laravel Sanctum 但即使我遵循了 Laravel Sanctum 文档中所述的所有内容 我也遇到了 CSRF 令牌不匹配 错误 cors php配置文件 paths gt api login logout s
  • 显示不同时区的时间

    有没有一种优雅的方式来显示另一个时区的当前时间 我想要一些具有以下一般精神的东西 cur
  • 如何扩展 Array 类并保留其实现

    我想向 Array 类添加一些函数 我不想将它们作为类外部的函数 因为理想情况下在键入时可以发现它们 跟随物体 这是我到目前为止所拥有的 export class List
  • RDLC - 在VS2010中添加数据源

    问候 我有一个 RDLC 文件 并且想向其中添加数据源 尽管到目前为止还没有任何运气 数据源是我自己编写的自定义类 只是补充一下 我们一直这样做 我们最近转换为 VS2010 RDLC 格式 这导致了一些问题 但我们对实现进行了一些更改 解
  • 从任务栏隐藏外部应用程序

    我浏览了许多不同的论坛 但找不到方法 我希望从任务栏隐藏外部应用程序图标 但不最小化应用程序 我不知道从哪里开始 也不知道如何去做 任何帮助将不胜感激 NOTE隐藏外部应用程序图标 而不是我的表单的图标 您可以使用橱窗展示功能 这是一个小示
  • 如何调整图像大小以适合浏览器窗口?

    这看起来微不足道 但经过所有研究和编码后 我无法让它发挥作用 条件是 浏览器窗口大小未知 因此 请不要提出涉及绝对像素大小的解决方案 图像的原始尺寸未知 并且可能适合也可能不适合浏览器窗口 图像垂直和水平居中 必须保留图像比例 图像必须完整
  • 允许 NULL arg 进行 sscanf?

    Is a NULL允许将指针作为字符串来存储调用中的结果sscanf 我在任何文档中都没有找到有关它的任何内容 但它似乎工作正常 同样的事情与scanf Example int main int arc char argv char s N
  • 如何在 HandshakeInterceptor 中设置主体

    我正在使用 Spring 的 WebSockets 的一个非常精简的实现 WebSocketSession 有 getPrincipal 方法 但如何在 HandshakeInterceptor 中设置它 我想将校长放入的方法是 publi
  • 在 AngularJS 中使用 $window 或 $location 进行重定向

    我正在开发的应用程序包含各种状态 使用 ui router 其中一些状态要求您登录 其他状态是公开可用的 我创建了一种有效检查用户是否登录的方法 我目前遇到的问题实际上是在必要时重定向到我们的登录页面 应该注意的是 登录页面当前并未放置在
  • Celery - 检查工作人员是否收到 SIGTERM

    我有一个Celery任务相当长 超过几分钟 有时 由于各种原因 一个工作人员被标记为终止 而另一个工作人员则开始工作 如果需要更换运行它的计算机 或者正在部署新的代码版本 则可能会发生这种情况 在这种情况下 工作线程会收到 SIGTERM
  • 设置列的最大值

    我有一个表 其中有一列 int 类型 称为年龄 此列应包含最大值 50 如果超过 则不应更新该行 表示此列应采用 0 到 50 之间的值 如果我尝试将其更新为 51 则不允许 任何人都可以帮忙吗 尝试这个 CREATE TRIGGER ch
  • 我是否已达到浏览器中 JavaScript 可以处理的对象大小的限制?

    我正在嵌入一个大数组
  • 在 SQL Server 中查找重复行

    我有一个组织的 SQL Server 数据库 并且有许多重复的行 我想运行一个 select 语句来获取所有这些内容以及重复的数量 同时还返回与每个组织关联的 id 像这样的声明 SELECT orgName COUNT AS dupes
  • 使用匹配器的组方法时“未找到匹配”

    我在用着Pattern Matcher获取 HTTP 响应中的响应代码 groupCount返回 1 但在尝试获取它时出现异常 知道为什么吗 这是代码 get response code String firstHeader reader
  • CSS数据属性条件值选择器?

    给定 html 例如 div Jonh div div Jack div div Julian div 如何选择价值优于的元素1000 x gt 1000 首选项 通过 CSS 选择器 如果没有这样的事情 那么我将重新要求 JQuery J
  • 将参数从气流运算符传递给 SQL 模板

    如果我将 BigQueryOperator 与 SQL 模板结合使用 如何将参数传递给 SQL File sql 查询 sql SELECT FROM dataset task instance variable for execution
  • 如何一次从 3 个给定点绘制连续曲线

    我正在尝试在 Flash 中绘制一条连续的曲线 方法有很多 但到目前为止我发现没有一个完全符合我的要求 首先 我想使用 flash 图形 api 的 curveTo 方法 我不想每个曲线段对 lineTo 进行数百次调用来模拟曲线 根据我的
  • 使 Django forms.DateField 显示使用本地日期格式

    我正在尝试找到一种简单的方法来构建以澳大利亚格式 dd mm yyyy 显示日期的表单 这是我能找到的唯一方法 看来应该有更好的解决方案 注意事项 创建了一个新的小部件 以 dd mm yyyy 格式呈现日期值 创建了新的日期字段 将定位日