首页 > 解决方案 > Django ModelForm 的 DateTime 值在本地化关闭的情况下进行本地化/翻译

问题描述

所以我正在开发这个活动管理平台,我们使用的是 Django 3.0.4。在我暴露我的问题之前,我必须说我对 Django 和 python 本身有点陌生。

我目前的目标是允许管理员为特定事件设置特定日期。最初,该页面必须显示当前日期和详细信息。我已经可以使用下面显示的代码了

这是用于存储日期的模型示例

class Dates(models.Model):

    id = models.AutoField(db_column='ID', primary_key=True)
    datestart = models.DateTimeField(db_column='DateStart')
    dateend = models.DateTimeField(db_column='DateEnd')

    class Meta:
        db_table = 'Dates'

这是我的表格

class dateForm(forms.ModelForm):  
    class Meta:  
        model = Dates
        exclude = ['id']

这是我当前的视图功能


def editdates(request):
    dates_current = Dates.objects.get(id=1)
    dates_form = dateForm(instance=dates_current)

    if request.method == 'POST':

        submitted_data = request.POST.copy() #Might need to change incoming data before saving to db
        dates_form = diaAbertoSettingsForm(submitted_data, instance=dates_current) #Generate form with existing data

        if dates_form.is_valid():
            dates_form.save()

    return render(request=request,
                template_name = 'dates/edit.html',
                context = {'form': dates_form})

显示数据(日期)的同一页面还必须允许您提交更改,这相对容易做到。当我想提交表单时,真正的问题就开始了。

目前,我执行以下操作来显示当前值

<div class="column">
  <div class="field">
    {% if form.datestart.errors %}
      <div class="alert alert-danger">
        <strong>{{form.datestart.errors}}</strong>
      </div>
    {% endif %}
    <label class="label">Date Start</label>
    <div class="control">
      <input class="input" type="text" name="datestart" value='{{form.datestart.value}}'>
    </div>
  </div>
</div>

这一切都很好,直到您看到结果{{form.datestart.value}}不是您期望的正常的“YY-MM-DD H:M:S”日期时间(例如 2000-01-01 00:00:00)格式,但是像“2000 年 1 月 1 日午夜”这样的“写出”格式,当我希望用户编辑此日期时,这显然会导致问题。如果他们要保留格式,表单将返回一个错误,说明 dateTime 的格式无效。

为了解决这个问题,我尝试了以下方法:

  1. 关闭 settings.py 中的“格式本地化”并逐个模板
  2. 关闭“翻译”,同上
  3. 我尝试使用django 文档中描述的日期过滤器
  4. 我也尝试过使用django utils 中的日期时间解析器

除了文档之外,我还查看了其他资源,但似乎没有人分享我的问题。

如果我要放置{{form.datestart}}而不是{{form.datestart.value}},确实会使其正确,但是由于我想使用 bulma 的类,所以我看不到解决方法。

我怎样才能使它{{form.datestart.value}}出来,2000-01-01 00:00:00而不是作为Jan. 1, 2000, midnight

这只是一个例子,真实模型有大约 10 个不同的开始/结束日期,因此保持自动化的方法是理想的,但不是必需的。

标签: pythonhtmldjangodatetime

解决方案


我修好了它。解决方案相当简单,事后看来这是我一开始就应该做的。

首先,我关闭了全球本地化。其次,我将我的 modelForm 更改为以下

class dateForm(forms.ModelForm):  
    class Meta:  
        model = Dates
        exclude = ['id']
        widgets = {
            'datestart': DateTimeInput(attrs={'class': 'input'})
        }

这使我可以为我的字段提供自定义类。然后在模板中我<input class="input" type="text" name="datestart" value='{{form.datestart.value}}'>用完整的字段替换{{form.datestart}}


推荐阅读