【问题标题】:Django truncating am/pm in form time inputDjango 在表单时间输入中截断 am/pm
【发布时间】:2016-03-31 22:12:52
【问题描述】:

我有一个带有日期/时间输入的表单,输入接口由 Bootstrap 3 datetimepicker 提供。当我尝试提交表单时,它给了我一个验证错误,因为时间由于 am/pm 组件而无效。如何更改模型接受为有效日期/时间的格式,以便正确解析 am/pm 组件?或者有没有办法在JS中预处理日期?

views.py

    def new_appointment_existing_client(request):
        form = NewAppointmentExistingClientForm()

        context = {'form': form}
        if request.method == 'POST':
            form = NewAppointmentExistingClientForm(data=request.POST)
            context['form'] = form
            #form.data['date'] =  datetime.datetime.strptime(form.data['date'], '%Y-%m-%d %H:%M %p')

            if form.is_valid():

                form.save()
                return HttpResponseRedirect('/calendar/')
        return render(request, 'new_appointment.html', context)

new_appointment.html

    {% extends 'base.html' %}

    {% block startscripts %}

    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-datetimepicker/4.17.37/css/bootstrap-datetimepicker.css" type="text/css" media="all" />

    {% endblock startscripts %}


    {% block content %}

    <h3>Create an Appointment</h3>
    <br>
    <br>

    <div class='row'>
        <div class='col-md-6'>
            <form method='POST' action ='/new_appointment/' id='id_new_appointment_form' enctype="multipart/form-data">

                {{ form.as_p }}
                {% csrf_token %}
                {% if form.errors %}
                <div class='form-group has-error'>
                    <span class='help-block'>{{ form.text.errors }}</span>
                </div>
                {% endif %}

                <input type="submit" id='id_form_submit' value="Submit" />

            </form>
        </div>
    </div>

    {% endblock content %}

    {% block endscripts %}
        <script type='text/javascript' src='https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.10.6/moment.min.js'></script>
        <script type="text/javascript" src="https://cdn.jsdelivr.net/bootstrap.datetimepicker/4.17.37/js/bootstrap-datetimepicker.min.js"></script>


    <script>
        jQuery(document).ready(function($){
                jQuery("#id_date").datetimepicker({
                    format: 'YYYY-MM-DD hh:mm a'
                });

        });

    </script>
    {% endblock endscripts %}

models.py

    class Appointment(models.Model):
        date = models.DateTimeField()
        appointment_person = models.ForeignKey(Person)

forms.py

    class NewAppointmentExistingClientForm(forms.models.ModelForm):
        class Meta:
            model = Appointment
            fields = ('date',
                'appointment_person',
                )
            widgets = {
            'date': forms.DateTimeInput(format=['%Y-%m-%d %I:%M %p']),

}

【问题讨论】:

    标签: javascript python django forms twitter-bootstrap


    【解决方案1】:

    如果您在任何地方都使用这种日期时间格式,您应该覆盖 settings.py 文件中的两个默认设置:

    DATETIME_FORMAT = '%Y-%m-%d %I:%M %p'
    

    DATETIME_FORMAT 值将是模板中渲染日期时间字段使用的默认格式

    对于验证,我建议重写默认的DATETIME_INPUT_FORMATS 元组,这些元素用于通过按顺序测试来验证日期时间字段。 只需添加你想要的格式作为这个元组的第一个元素,我的意思是 DATETIME_INPUT_FORMATS[0] 。

    默认是

    DATETIME_INPUT_FORMATS (
        '%Y-%m-%d %H:%M:%S',     # '2006-10-25 14:30:59'
        '%Y-%m-%d %H:%M:%S.%f',  # '2006-10-25 14:30:59.000200'
        '%Y-%m-%d %H:%M',        # '2006-10-25 14:30'
        '%Y-%m-%d',              # '2006-10-25'
        '%m/%d/%Y %H:%M:%S',     # '10/25/2006 14:30:59'
        '%m/%d/%Y %H:%M:%S.%f',  # '10/25/2006 14:30:59.000200'
        '%m/%d/%Y %H:%M',        # '10/25/2006 14:30'
        '%m/%d/%Y',              # '10/25/2006'
        '%m/%d/%y %H:%M:%S',     # '10/25/06 14:30:59'
        '%m/%d/%y %H:%M:%S.%f',  # '10/25/06 14:30:59.000200'
        '%m/%d/%y %H:%M',        # '10/25/06 14:30'
        '%m/%d/%y',              # '10/25/06'
    )
    

    首先用你的格式 '%Y-%m-%d %I:%M %p' 更新它:

    DATETIME_INPUT_FORMATS (
        '%Y-%m-%d %I:%M %p',
        '%Y-%m-%d %H:%M:%S',     # '2006-10-25 14:30:59'
        '%Y-%m-%d %H:%M:%S.%f',  # '2006-10-25 14:30:59.000200'
        '%Y-%m-%d %H:%M',        # '2006-10-25 14:30'
        '%Y-%m-%d',              # '2006-10-25'
        '%m/%d/%Y %H:%M:%S',     # '10/25/2006 14:30:59'
        '%m/%d/%Y %H:%M:%S.%f',  # '10/25/2006 14:30:59.000200'
        '%m/%d/%Y %H:%M',        # '10/25/2006 14:30'
        '%m/%d/%Y',              # '10/25/2006'
        '%m/%d/%y %H:%M:%S',     # '10/25/06 14:30:59'
        '%m/%d/%y %H:%M:%S.%f',  # '10/25/06 14:30:59.000200'
        '%m/%d/%y %H:%M',        # '10/25/06 14:30'
        '%m/%d/%y',              # '10/25/06'
    )
    

    现在默认渲染和验证应该可以按预期工作,而无需向日期时间字段添加任何参数。

    保持您的日期时间字段清洁:

    date = models.DateTimeField()
    

    【讨论】:

      【解决方案2】:

      DateTimeField 包含一个input_formats 参数,可让您指定接受的格式;您可以添加一个包含上午/下午:

      date = forms.DateTimeField(input_formats=['%Y-%m-%d %H:%M %p'])
      

      【讨论】:

      • 将输入格式添加为小部件,因为我使用的是models.ModelForm(我已编辑问题以显示新小部件)。我阅读了文档,当它是小部件的一部分时,看起来该选项已切换为format。看起来字符串是正确的,因为当我检查 datetime.datetime.strptime(form.data['date'], '%Y-%m-%d %I:%M %p') 的值时,我得到了正确的 datetime 对象,但是当我尝试提交表单时,我仍然收到 ['Enter a valid date/time.'] 错误。知道为什么会这样吗?
      • 因为小部件用于显示,而不是验证;这就是为什么我给你一个字段的例子。无需对我上面给出的代码进行任何更改。
      猜你喜欢
      • 1970-01-01
      • 2014-12-31
      • 2022-01-19
      • 2021-12-26
      • 2011-06-08
      • 1970-01-01
      • 2014-12-07
      • 1970-01-01
      • 2017-07-21
      相关资源
      最近更新 更多