更改 Django 管理中日期字段的默认小部件

2023-12-22

如何更改 Django ADMIN 中 DateField 实例的默认小部件?

我知道如何为 ModelForm 执行此操作 -如何更改 ModelForm 中所有 Django 日期字段的默认小部件? https://stackoverflow.com/questions/660929/how-do-you-change-the-default-widget-for-all-django-date-fields-in-a-modelform- 通过提供 formfield_callback 检查字段类型,然后提供带有新小部件的表单字段。

然而,我的一些 ModelAdmin 可能已经有了自定义 ModelForm,有些还没有。我不想在有日期字段的地方提供/更改 ModelForm(这就是重点)。

不过,可用于子类化的自定义 ModelAdmin 就可以了。模型管理员如何更改其表单的日期字段,而不管是否提供了自定义模型表单?

也许 ModelAdmin 具有 get_form() 调用其超级然后设置表单的 formfield_callback ?似乎有点复杂,不确定时间,而且如果任何 ModelAdmin 需要进一步定制,则需要注意三件事......

P.S.:我问这个之后https://stackoverflow.com/questions/8484811/jquery-datepicker-in-django-admin https://stackoverflow.com/questions/8484811/jquery-datepicker-in-django-admin由于是上述 ModelForm 问题的“精确重复”而被错误地关闭。我希望现在差异已经清楚了。

顺便说一句,我个人的动机是 django admin 默认日期选择器的年份导航。生日真的很糟糕......:-) 是的,有一张三年前的票https://code.djangoproject.com/ticket/9388 https://code.djangoproject.com/ticket/9388


我能够在 Django 管理中自定义默认日期小部件。我遵循了两个教程(来自简单胜于复杂 https://simpleisbetterthancomplex.com/tutorial/2019/01/03/how-to-use-date-picker-with-django.html and Django 自定义小部件 https://blog.ihfazh.com/django-custom-widget-with-3-examples.html)

  1. 在名为的文件中编写自定义小部件widgets.py在你的 Django 应用程序中
from django.forms import DateInput


class CustomDatePickerInput(DateInput):
    template_name = "app_name/widgets/custom_datepicker.html"

    class Media:
        css = {
            "all": (
                "https://cdnjs.cloudflare.com/ajax/libs/datepicker/0.6.5/datepicker.min.css",
            )
        }
        js = (
            "https://code.jquery.com/jquery-3.4.1.min.js",
            "https://cdnjs.cloudflare.com/ajax/libs/datepicker/0.6.5/datepicker.min.js",
            "https://cdnjs.cloudflare.com/ajax/libs/datepicker/0.6.5/i18n/datepicker.es-ES.min.js",
        )

请注意,您可能需要的 CSS 和 JS 文件应添加到内部Media类如上面的代码所示。在本例中,它为自定义添加样式日期选择器 https://github.com/fengyuanchen/datepicker.

  1. 为您的小部件定义模板,有关更多日期选择器选项,请参阅here https://github.com/fengyuanchen/datepicker#options,把这个文件放入app_name/templates/app_name/widgets/custom_datepicker.html或确保此模板与值匹配template_name在您的自定义小部件中:
{% load i18n %}

{% include "django/forms/widgets/input.html" %}
{% get_current_language as LANGUAGE_CODE %}

<script>
  $(function () {
    const DATE_PICKER_OPTIONS = {
      'en-us': {
        format: 'yyyy-mm-dd',
        language: ''
      },
      'es': {
        format: 'dd/mm/yyyy',
        language: 'es-ES'
      }
    };
    let options = DATE_PICKER_OPTIONS['{{ LANGUAGE_CODE }}'];
    $("input[name='{{ widget.name }}']").datepicker({
      format: options.format,
      language: options.language
    });
  });
</script>
  1. 在 Django 管理中注册模型时,您需要指示在日期字段中使用什么小部件(使用formfield_overrides)
@admin.register(YourModel)
class YourModelAdmin(admin.ModelAdmin):
    formfield_overrides = {models.DateField: {"widget": CustomDatePickerInput}}

完成此操作后,您将在 Django 管理员中拥有一个用于日期的自定义小部件。请记住,这只是一个指南,您可以通过查看我指出的两个教程来进一步了解。

Note:这个小部件的实现也支持国际化。

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

更改 Django 管理中日期字段的默认小部件 的相关文章

随机推荐