gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 09:56:53 28 4
gpt4 key购买 nike

我试图找到一种简单的方法来构建以澳大利亚格式 (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 绝地武士,但是......

    我不认为你的方法有什么问题。这是一个干净的阅读。

    您可能不需要创建自己的小部件只是为了在第一个表单显示上以正确的格式呈现日期。只需使用 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 (请参阅 accepted answer 了解这个远相关的问题),意思是:
    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 的问题机制有两个:
  • 它的可读性较差,并且依赖于对 ModelForms 内部工作原理的了解。我在任何地方都找不到有关 formfield_callback 的实际文档...
  • 如果您需要在 ModelForm 中重新定义模型字段,请说使该字段对于该表单的特定实例不是必需的,如下所示:
       class MyModelForm(forms.ModelForm):
    formfield_callback = customize_fields
    foo = forms.DateField(required=false)

    class Meta:
    model = Bar

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

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

    关于django - 使 Django forms.DateField 显示使用本地日期格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1453413/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com