在Django Admin中自定义日期选择器

Pet*_*ann 5 django django-admin

如何在Django Admin中自定义日期选择器?

我想删除"今天"链接,并将图形选择器中的月份值设置为比当前月份更多的月份.

lmi*_*asf 7

我能够在 Django 管理中自定义默认日期小部件。我遵循了两个教程(来自Simple is Better than ComplexDjango Custom Widget

  1. widgets.pyDjango 应用程序内部调用的文件中编写自定义小部件
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",
        )

Run Code Online (Sandbox Code Playgroud)

请注意,您可能需要的 CSS 和 JS 文件应该添加到内部Media类中,如上面的代码所示。在这种情况下,它为自定义日期选择器添加样式。

  1. 为您的小部件定义模板,有关更多日期选择器的选项,请参见此处,将此文件放入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>
Run Code Online (Sandbox Code Playgroud)

在您的情况下,您应该添加选项date(例如date: new Date(2014, 1, 14):),因为您还询问如何选择另一个月份。

  1. 在 Django 管理中注册模型时,您需要在日期字段中指明要使用的小部件(使用formfield_overrides
@admin.register(YourModel)
class YourModelAdmin(admin.ModelAdmin):
    formfield_overrides = {models.DateField: {"widget": CustomDatePickerInput}}
Run Code Online (Sandbox Code Playgroud)

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

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


ale*_*rsh 5

尝试编写自己的Widget,然后像这样覆盖你的:

class CustomerAdmin(admin.ModelAdmin):
    formfield_overrides = {
        models.DateField: { 'widget': AdminDateWidget },
    }
Run Code Online (Sandbox Code Playgroud)