Django DateTimeInput 类型“datetime-local”未保存到数据库

2024-04-16

我正在开发一个 django 应用程序来记录交易。所有交易文档都在一页上完成,并使用内联表单集显示交易的所有进入和退出。在日期时间输入字段之前,一切都运行良好。如果我删除“类型”,表单效果很好,但非常不用户友好。

Working entries with no 'type' https://i.imgur.com/wvmD2ux.png

Non-working entries with 'type': 'datetime-local' https://i.imgur.com/3DtbiUZ.png

所以我想你可能会说 datetime-local 造成了几个问题,或者也许这不是 datetime-local 的罪魁祸首。我已经被困了一整天了,我真的不确定问题来自哪里:

  1. Entry.date 值不再填充到字段中
  2. 当在 datetimepicker 中选择新的日期和时间时,它不会保存
  3. datetime-local 删除了秒,我们需要秒

模型.py

from django.db.models.functions import datetime

class Entry(models.Model):
    ENTRY = 'entry'
    EXIT = 'exit'

    ENTRY_TYPE_CHOICES = [
        (ENTRY, 'Entry'),
        (EXIT, 'Exit'),
    ]

    class Meta:
        verbose_name = "Entry"
        verbose_name_plural = "Entries"

    trade = models.ForeignKey(Trade, on_delete=models.CASCADE)
    date = models.DateTimeField(null=True, blank=True, default=datetime.datetime.now)
    amount = models.FloatField(null=True)
    price = models.FloatField(null=True, blank=True)
    fee = models.FloatField(null=True, blank=True)
    entry_type = models.CharField(max_length=5, choices=ENTRY_TYPE_CHOICES, default=ENTRY)

forms.py

class EntriesForm(ModelForm):
    class Meta:
        model = Entry
        exclude = ()
        widgets = {
            'date': forms.DateTimeInput(attrs={'type':'datetime-local', 'class':'form-control'}),
        }

EntriesFormSet = inlineformset_factory(Trade, Entry, form=EntriesForm, extra=1)

views.py

class TradeUpdateView(UpdateView):
    model = Trade
    form_class = CreateForm
    success_url = reverse_lazy('trade-list')

    def get_context_data(self, **kwargs):
        data = super(TradeUpdateView, self).get_context_data(**kwargs)
        if self.request.POST:
            data['entries'] = EntriesFormSet(self.request.POST, instance=self.object)
        else:
            data['entries'] = EntriesFormSet(instance=self.object)
        return data

    def form_valid(self, form):
        form.instance.user = self.request.user
        form.instance.created_by = self.request.user
        context = self.get_context_data()
        entries = context['entries']
        with transaction.atomic():
            self.object = form.save()

            if entries.is_valid():
                entries.instance = self.object
                entries.save()
        return super(TradeUpdateView, self).form_valid(form)

trade_form.html

{% extends 'dashboard/base.html' %}
{% load static %}

{% block content %}

<script type="text/javascript" src="{% static 'vendor/jquery/jquery.js' %}"></script>
<script type="text/javascript" src="{% static 'admin/js/vendor/jquery/jquery.js' %}"></script>

<!-- Page Heading -->
<div class="d-sm-flex align-items-center justify-content-between mb-3">
    <h2>New Trade</h2>
</div>

<div class="row">
    <div class="col">
        <form action="" method="post">{% csrf_token %}
            {{ form.as_p }}

            <table class="table">
                {{ entries.management_form }}

                {% for form in entries.forms %}
                {% if forloop.first %}
                <thead>
                <tr>
                    {% for field in form.visible_fields %}
                    <th>{{ field.label|capfirst }}</th>
                    {% endfor %}
                </tr>
                </thead>
                {% endif %}
                <tr class="{% cycle row1 row2 %} formset_row">
                    {% for field in form.visible_fields %}
                    <td>
                        {# Include the hidden fields in the form #}
                        {% if forloop.first %}
                        {% for hidden in form.hidden_fields %}
                        {{ hidden }}
                        {% endfor %}
                        {% endif %}
                        {{ field.errors.as_ul }}
                        {{ field }}
                    </td>
                    {% endfor %}
                </tr>
                {% endfor %}
            </table>
            <input type="submit" value="Save"/> <a href="{% url 'trade-list' %}">back to the list</a>
        </form>
    </div>


</div>


<script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
<script src="{% static 'js/formset/jquery.formset.js' %}"></script>
<script type="text/javascript">
    $('.formset_row').formset({
        addText: 'add entry',
        deleteText: 'remove',
        prefix: 'entry_set'
    });

</script>


{% endblock content %}

字段提交的格式为type=datetime-local似乎不是 Django 接受的,这在我的本地测试中导致表单无法保存。可以将字段的日期时间格式添加到 django 接受的格式中DATETIME_INPUT_FORMATS在设置文件中(参见https://docs.djangoproject.com/en/3.0/ref/settings/#std:setting-DATETIME_INPUT_FORMATS https://docs.djangoproject.com/en/3.0/ref/settings/#std:setting-DATETIME_INPUT_FORMATS)。但是,如果您使用本地化(即USE_L10N = True在您的设置中)然后 DATETIME_INPUT_FORMATS 似乎未使用(根据我的测试 - 我还没有审查底层代码)。在我花费的(诚然有限的)时间内,我根本无法让 DATETIME_INPUT_FORMATS 产生任何效果。

鉴于支持非常有限datetime-local并且在任何情况下都很难让 django 接受结果,我建议您考虑使用日期时间小部件,它可以为您提供更多控制和更好的跨浏览器兼容性。 Flatpickr 似乎(截至 2020 年 2 月)需要维护且依赖项非常有限(https://flatpickr.js.org/ https://flatpickr.js.org/).

在您的情况下,要使用 Flatpickr,您需要在相关 HTML 文件的顶部包含以下内容:

<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/flatpickr/dist/flatpickr.min.css">
<script src="https://cdn.jsdelivr.net/npm/flatpickr"></script>


<script>
    // This code activates flatpickr on fields with the 'datetimefield' class when the document has loaded
    window.addEventListener("DOMContentLoaded", function () {
        flatpickr(".datetimefield", {
            enableTime: true,
            enableSeconds: true,
            dateFormat: "Y-m-d H:i:S",
        });
    });
</script>

并改变:

        widgets = {
            'date': forms.DateTimeInput(attrs={'type':'datetime-local', 'class':'form-control'}),
        }

to

        widgets = {
            'date': forms.DateTimeInput(format='%Y-%m-%d %H:%M:%S', attrs={'class':'datetimefield'}),
        }

这将导致 django 生成的字段具有也为 flatpickr 配置的格式(基于上面字段中的文本,并且 django 接受)。

您还可以使用许多其他日期选择器小部件,并且由于您已经在使用 jquery,因此拥有 jquery 依赖项对您来说不一定是一个大问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Django DateTimeInput 类型“datetime-local”未保存到数据库 的相关文章

  • PHP 中的 NOW() 函数

    是否有 PHP 函数以与 MySQL 函数相同的格式返回日期和时间NOW 我知道如何使用date 但我想问是否有专门用于此的功能 例如 返回 2009 12 01 00 00 00 您可以使用date https www php net m
  • 字符串中的注释和注释中的字符串

    我正在尝试使用 Python 和 Regex 计算 C 代码中包含的注释中的字符数 但没有成功 我可以先删除字符串以删除字符串中的注释 但这也会删除注释中的字符串 结果会很糟糕 是否有机会通过使用正则表达式来询问不匹配注释中的字符串 反之亦
  • 如何在VIM中设置文件的正确路径?

    每当我击中 pwd在 vim 中命令总是返回路径C Windows system32 即使我在桌面上的 Python 文件中 所以每当我跑步时 python 命令返回 python can t open file Users myname
  • 使用 Python 计算 Spark 中成对 (K,V) RDD 中每个 KEY 的平均值

    我想与 Python 共享这个特定的 Apache Spark 解决方案 因为它的文档非常贫乏 我想通过 KEY 计算 K V 对 存储在 Pairwise RDD 中 的平均值 示例数据如下所示 gt gt gt rdd1 take 10
  • 在相同任务上,Keras 比 TensorFlow 慢

    我正在使用 Python 运行斩首 DCNN 本例中为 Inception V3 来获取图像特征 我使用的是 Anaconda Py3 6 和 Windows7 使用 TensorFlow 时 我将会话保存在变量中 感谢 jdehesa 并
  • Alembic:如何迁移模型中的自定义类型?

    My User模型是 class User UserMixin db Model tablename users noinspection PyShadowingBuiltins uuid Column uuid GUID default
  • 设置 verify_certs=False 但 elasticsearch.Elasticsearch 因证书验证失败而引发 SSL 错误

    self host KibanaProxy 自我端口 443 self user 测试 self password 测试 我需要禁止证书验证 使用选项时它与curl一起使用 k在命令行上 但是 在使用 Elasticsearch pytho
  • 揭秘sharedctypes性能

    在 python 中 可以在多个进程之间共享 ctypes 对象 然而我注意到分配这些对象似乎非常昂贵 考虑以下代码 from multiprocessing import sharedctypes as sct import ctypes
  • Python Django-如何从输入文件标签读取文件?

    我不想将文件保存在我的服务器上 我只想在下一页中读取并打印该文件 现在我有这个 index html
  • 使用 Conda 更新特定模块会删除大量软件包

    我最近开始使用 Anaconda Python 发行版 因为它提供了许多开箱即用的数据分析库 使用 conda 创建环境和安装软件包也轻而易举 但是当我想更新 Python 本身或任何其他模块时 我遇到了一些严重的问题 我事先被告知我的很多
  • Werkzeug 中的线程和本地代理。用法

    首先 我想确保我正确理解了功能的分配 分配本地代理功能以通过线程内的模块 包 共享变量 对象 我对吗 其次 用法对我来说仍然不清楚 也许是因为我误解了作业 我用烧瓶 如果我有两个 或更多 模块 A B 我想将对象C从模块A导入到模块B 但我
  • `pyqt5'错误`元数据生成失败`

    我正在尝试安装pyqt5使用带有 M1 芯片和 Python 3 9 12 的 mac 操作系统 我怀疑M1芯片可能是原因 我收到一个错误metadata generation failed 最小工作示例 directly in the t
  • 如何在 Django 中使每五个帖子成为广告帖子

    我正在尝试允许用户赞助帖子 以便为该帖子带来更多点击量 我想让每五个帖子成为赞助帖子 但如果我尝试在模板中使用可整除并循环浏览广告 那么它将发布all第四个帖子后的广告 这是我尝试过的一些代码 编辑 我已将问题更改为不会显示帖子的问题 有人
  • Flask 应用程序的测试覆盖率不起作用

    您好 想在终端的 Flask 应用程序中测试 删除路由 我可以看到测试已经过去 它说 test user delete test app LayoutTestCase ok 但是当我打开封面时 它仍然是红色的 这意味着没有覆盖它 请有人向我
  • 带有 RotatingFileHandler 的 Python 3 记录器超出 maxBytes 限制

    我使用以下代码来限制日志文件的大小 最小示例 import logging from logging handlers import RotatingFileHandler Set up logfile and message loggin
  • Python问题:打开和关闭文件返回语法错误

    大家好 我发现了这个有用的 python 脚本 它允许我从网站获取一些天气数据 我将创建一个文件和其中的数据集 有些东西不起作用 它返回此错误 File
  • 计算互相关函数?

    In R 我在用ccf or acf计算成对互相关函数 以便我可以找出哪个移位给我带来最大值 从它的外观来看 R给我一个标准化的值序列 Python 的 scipy 中是否有类似的东西 或者我应该使用fft模块 目前 我正在这样做 xcor
  • [cocos2d-x]当我尝试在 Windows 10 中运行“python android-build.py -p 19 cpp-tests”时出现错误

    当我尝试运行命令时python android build p cpp tests 我收到如图所示的错误 在此之前 我收到了另一条关于 Android SDK Tools 版本兼容性的错误消息 所以 我只是将 sdk 版本从 26 0 0
  • 使用 Python 将对象列表转为 JSON

    我在转换时遇到问题Object实例到 JSON ob Object list name scaping myObj base url u number page for ob in list name json string json du
  • 使用Multiprocessing和Pool时如何访问全局变量?

    我试图避免将变量冗余地传递到dataList e g 1 globalDict 2 globalDict 3 globalDict 并在全球范围内使用它们 global globalDict然而 在下面的代码中并不是这样做的解决方案 是否有

随机推荐