如何在 Django REST Framework HTML 表单中自动设置 DateTime 字段的值?

Posted

技术标签:

【中文标题】如何在 Django REST Framework HTML 表单中自动设置 DateTime 字段的值?【英文标题】:How to set value of DateTime field automatically in Django REST Framework HTML form? 【发布时间】:2021-09-03 06:24:53 【问题描述】:

我有一个非常基本的 Django 模型,并在 Django REST 框架中使用它。

当使用可浏览 API 工具并请求资源实例时,我可以使用页面底部的 html 表单设置不同属性的值。除 DateTime 字段外,所有属性都预设了当前值。是否需要特殊设置,以便日期时间条目字段的表单字段预填充其当前值?

模型类:

class C(models.Model):

    OrderDate = models.DateTimeField(auto_now=False)

    p1 = models.ForeignKey(PA, related_name="cs", on_delete=models.CASCADE, null=True)
    p2 = models.ForeignKey(PB, related_name="cs", on_delete=models.DO_NOTHING, null=True)

    class Meta:
        ordering = ['OrderDate']

查看:

class CViewSet(viewsets.ModelViewSet):
    queryset         = C.objects.all().order_by('-OrderDate')
    serializer_class = CSerializer

    def get_queryset(self):
        cs = C.objects.all()
        # Some filters...
        return cs

序列化器:

class CSerializer(serializers.HyperlinkedModelSerializer):
    p1 = PASerializer(many=False, read_only=True)
    p2 = PBSerializer(many=False, read_only=True)

    class Meta:
        model = C
        fields = (
            'id', 
            'OrderDate',
            'p1',
            'p2',
        )

我试图概括代码希望大体思路清晰。

我希望OrderDate 字段在显示可浏览 API 中的 HTML 表单时预先填充当前值。

【问题讨论】:

请将您的模型、序列化程序和视图添加到您的问题中 【参考方案1】:

在 DateTimeField 中有 2 个选项,添加 default 值或使用 auto_now_add

在你的情况下你已经设置了auto_now,并且根据this question

auto_now - 每次调用 Model.save() 时,将字段的值更新为当前时间和日期。

auto_now_add - 使用记录创建的时间和日期更新值。

所以你有这两种可能性:

OrderDate = models.DateTimeField(default=datetime.now)

OrderDate = models.DateTimeField(auto_now_add=True)

如果您想在用户提交表单时自动添加当前时间而不在​​您的 HTML 中显示它,这是可行的,如果您想在 html 字段(您的表单)中显示当前日期和时间,那么您必须使用 javascript 和 HTML 在前端设置它

Use:  <input type="datetime-local">

【讨论】:

谢谢,使用auto_date_add 很好。但是,我最初的问题是我希望在可浏览的 API HTML 表单中使用当前值填充 DateTime 表单字段。如果你知道这是怎么可能的,那就太好了。你的前端想法不是我的意思。【参考方案2】:

我是 django drf 的新手,遇到了同样的问题,这解决了。 (DATETIME_FORMATsettings.py) 我的猜测是因为在渲染 html 时,它使用的格式与 DRF 使用的格式不同

REST_FRAMEWORK = 
    'DEFAULT_PAGINATION_CLASS': 
    'rest_framework.pagination.PageNumberPagination',
    'PAGE_SIZE': 10,
    'DATETIME_FORMAT' : '%Y-%m-%dT%H:%M',

【讨论】:

以上是关于如何在 Django REST Framework HTML 表单中自动设置 DateTime 字段的值?的主要内容,如果未能解决你的问题,请参考以下文章

Django.rest_framework:如何序列化一对多?

如何使用 TemplateHTMLRenderer 在 Django-REST-Framework 中创建/放置?

django-rest-framework:如何序列化已经包含 JSON 的字段?

如何在 Django Rest Framework 中散列 Django 用户密码?

如何仅使用 django 作为后端并使用 django-rest-framework 发布

如何在 React 中显示来自 django-rest-framework 的错误消息