【问题标题】:Django datefield default save format overwritingDjango 日期字段默认保存格式覆盖
【发布时间】:2020-07-16 07:56:05
【问题描述】:

我有一个 postgresql9.6 表,它有一个 char 字段:“start_date”,格式类似于“20200101”。
并且我创建了一个 Django2.0 模型:

class TestModel(models.Model):
    start_date = models.DateField('start_date')

我的 admin.py 是:

class TestAdmin(admin.ModelAdmin):
    list_display = ('start_date',)

admin.site.register(TestModel, TestAdmin)

而且我还修改了settings.py:

USE_L10N = False

DATE_INPUT_FORMATS = ['%Y%m%d']
DATE_FORMATS = ['%Y%m%d']

所以我在网络表单中获取日期:'20200101',但是当我保存表单时,显示错误:
'值的日期格式无效。一定是 ” "以 YYYY-MM-DD 格式。'
我知道 DateField 保存日期默认使用 'YYYY-MM-DD' 格式,但我需要将其更改为 'YYYYMMDD' 以便将一致的数据保存到 pg 数据库中。
那么如何覆盖 DateField 或 Model 函数来改变默认格式呢?

【问题讨论】:

  • 你可以在你的模型上添加一个CharField,并验证它看起来像一个日期吗?
  • 我试过了,但我需要使用管理站点的 datepicker 小部件,所以我将字段更改为 DateField。
  • 您想以这种格式 YYYY-MM-DD 保存在 DB 中并从 DB YYYYMMDD 中获取吗?这可能会有所帮助:stackoverflow.com/questions/53402437/…
  • 我想用 YYYYMMDD 将数据保存在数据库中
  • 在你的设置文件中你应该定义 `DATETIME_FORMAT = %Y%m%d' 并在你的模型中使用 DateTimeField

标签: python django


【解决方案1】:

您可以在模型的模型表单中使用CharFieldDateInput 小部件

class TestModel(models.Model):
    start_date = models.CharField(max_length=8)

class TestModelForm(forms.ModelForm):
    class Meta:
        model = TestModel
        fields = ['start_date']
        widgets = {'start_date': forms.DateInput(format='%Y%m%d')}

class TestAdmin(admin.ModelAdmin):
    form = TestModelForm
    list_display = ('start_date',)

【讨论】:

  • 谢谢,但我不想使用文本输入类型,我想使用 datepicker 小部件,那么 DateInput 可以更改它的 input_type 以与 datepicker 一起使用吗?
【解决方案2】:

感谢@Iain Shelvington,我终于找到了解决问题的解决方案。这是我的代码:

class TestModel(models.Model):
    start_date = models.CharField(max_length=8)

class TestModelForm(forms.ModelForm):
    class Meta:
        model = TestModel
        fields = ['start_date']
        widgets = {'start_date': forms.DateInput(format='%Y%m%d', attrs={'class': 'form-control', 'type': 'date'})}

class TestAdmin(admin.ModelAdmin):
    form = TestModelForm
    list_display = ('start_date',)

通常,我修改了 admin.py 的 save_model 以将带有 YYYYMMDD 的日期保存到 pg9.6:

 def save_model(self, request, obj, form, change):

        import re
        obj.start_date = str(re.sub('-', '', obj.start_date))
        obj.stop_date = str(re.sub('-', '', obj.stop_date))
        super().save_model(request, obj, form, change)

【讨论】:

    猜你喜欢
    • 2017-04-26
    • 2016-02-05
    • 1970-01-01
    • 1970-01-01
    • 2014-10-01
    • 2019-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多