【问题标题】:Django Form Doesn't Accept DateTime From DateTimePickerDjango 表单不接受来自 DateTimePicker 的 DateTime
【发布时间】:2019-11-24 18:08:18
【问题描述】:

我正在开发一个待办事项网络应用程序,并让用户使用来自 here 的自定义引导日期时间选择器输入事件日期时间。我在格式为 MM/DD/YY hh:mm A 的表单上有自定义小部件。但是,Django 不接受该表单。一个类似的问题是asked,但我不想覆盖默认的 DateTimeInput,而是希望表单以某种格式显示,但以默认格式存储在数据库中。我正在考虑使用小部件调整来自定义选择器,但我不知道如何以默认格式存储它。最好的方法是什么?

Forms.py

from bootstrap_modal_forms.forms import BSModalForm
from .widgets import BootstrapDateTimePickerInput
from bootstrap_datepicker_plus import DateTimePickerInput
from .models import ToDoItem

class NewEventForm(BSModalForm):
    class Meta:
        model = ToDoItem
        fields = ['title', 'description', 'start_time', 'end_time', 'remind_time']
        widgets = {
            'start_time': DateTimePickerInput(
                options={"format": "MM/DD/YYYY hh:mm A"}
            ), 
            'end_time': DateTimePickerInput(
                options={"format": "MM/DD/YYYY hh:mm A"}
            ),
            'remind_time': DateTimePickerInput(
                options={"format": "MM/DD/YYYY hh:mm A"}
            ),
        }     

活动形式:

{% load bootstrap4 %}
{% load static %}
{% bootstrap_css %}   
{% bootstrap_javascript jquery='full' %}
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <!-- Custom Stylesheet -->
    <link rel="stylesheet" type="text/css" href="{% static 'main/main.css' %}">

    <!-- Moment.js -->
    <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.23.0/moment.min.js" integrity="sha256-VBLiveTKyUZMEzJd6z2mhfxIqz3ZATCuVMawPZGzIfA=" crossorigin="anonymous"></script>

    {{ form.media }} 
</head>
<body>
    <form method="POST" action=""> 
    {% csrf_token %}

        <div class="modal-header">
            <h5 class="modal-title">New Event</h5>
            <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                <span aria-hidden="true">&times;</span>
            </button>
        </div>

        <div class="modal-body"> 
            <fieldset class="form-group">
                    {% bootstrap_form form %}
            </fieldset> 
        </div>

        <div class="modal-footer">
            <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
            <button type="button" class="submit-btn btn btn-primary">Create</button>
        </div>

    </form>
</body>
</html>

【问题讨论】:

    标签: python django bootstrap-4 bootstrap-datetimepicker


    【解决方案1】:

    您可以在前端使用至少 3 个知名的 JS 日期/时间操纵器和本机堆栈来执行此操作。您可以在后端使用 django 的工具、python datetime 库、一个名为 dateparsedateparser、python dateutil 等的库来完成。

    这是一个普遍解决的问题(例如学校论文):)

    但对您有帮助的一件事是知道表单字段有一个名为 to_python() 的方法:您可以继承 DateTimeField 并覆盖该方法。

    您不必照顾返回的路,但如果您愿意,为了完整起见,它会是Widget.format_value()

    在后端(或者实际上在人类不必查看的任何地方)使用的最佳格式是Iso8601

    【讨论】:

    • 抱歉回复晚了,但是我使用models.DateTimeField还是forms.DateTimeField有关系吗?我对 Django 很陌生,我不知道有什么区别。另外,如果我错了,请纠正我,我会将 DateTimeField 子类化为后端日期存储并使用 js 显示日期?
    • 模型日期时间字段靠近数据库层。表单被发送到表单层,在那里您有 forms.DateTimeField ,因此在那里进行任何转换更有意义。该字段的数据库版本处理与数据库之间的翻译。是的,您将使用该自定义小部件进行显示,然后“拦截”表单字段中的输入。
    • 如果我使用 forms.DateTimeField,我会在哪里告诉 DateTimePicker 从我覆盖的 DateTimeField 而不是常规的 Django 中继承?我是否也必须覆盖自定义小部件?
    猜你喜欢
    • 2018-09-25
    • 2016-02-11
    • 1970-01-01
    • 2015-09-07
    • 1970-01-01
    • 1970-01-01
    • 2015-05-21
    • 1970-01-01
    • 2012-08-18
    相关资源
    最近更新 更多