Изменить виджет по умолчанию для полей даты в Django admin - PullRequest
4 голосов
/ 15 декабря 2011

Как я могу изменить виджет по умолчанию для экземпляров DateField в администраторе Django?

Я знаю, как это сделать для ModelForm , предоставив formfield_callback, который проверяет тип поля, а затемпредоставляет поле формы с новым виджетом.

Однако некоторые из моих ModelAdmin могут уже иметь собственную ModelForm, а некоторые - нет.Я не хочу предоставлять / изменять ModelForm везде, где есть поле даты (в этом вся суть).

Однако вполне подойдет пользователь ModelAdmin, который можно использовать для создания подклассов.Как ModelAdmin может изменить поля даты своей формы, независимо от того, была ли предоставлена ​​пользовательская ModelForm или нет?

Может быть, ModelAdmin с get_form () вызывает его super, а затем устанавливает formfield_callback формы?Кажется, немного запутанным, не уверен насчет сроков, а также есть три вещи, которые нужно знать, если какой-то ModelAdmin нуждается в дальнейшей настройке.

PS: я спрашиваю после это было ошибочнозакрыто за то, что является «точной копией» вышеупомянутого вопроса ModelForm.Я надеюсь, что разница теперь ясна.

Кстати, моя личная мотивация - год навигации по умолчанию для выбора даты администратора django.Действительно плохо для дней рождений ... :-) да, есть трехлетний билет .

Ответы [ 2 ]

1 голос
/ 15 декабря 2011

ModelAdmin может изменять только виджет формы, которую он отображает, поэтому было бы трудно переопределить виджеты переданной ему пользовательской формы - по крайней мере, я не могу придумать чистый способ сделать это.

Я вижу несколько вариантов для вас, в зависимости от того, как / что вы хотите настроить.

  1. Изменить JavaScript, который делает магию для виджета. Это кажется достаточно простым, если ваши изменения могут быть обработаны там. Просто предоставьте свои js/calendar.js и js/admin/DateTimeShortcuts.js так же, как вы переопределяете шаблоны администратора. У этого есть дополнительный бонус того, чтобы быть дружественным к обновлению; так как вы не изменяете базу кода Django; также изменение будет немедленным для всех форм, которые используют виджет.

  2. Настройте встроенный виджет Django, чтобы делать то, что вы хотите. Это дает преимущество мгновенной работы без каких-либо модификаций существующего кода, но не подходит для обновления, если вы не будете осторожны с исправлением исходников. Источник: django.contrib.admin.widgets

  3. Предоставьте свой собственный пользовательский виджет - но тогда вы вернетесь к проблеме прохождения кода и ручного переопределения всех экземпляров виджета своим собственным.

  4. Используйте что-то вроде grappelli и измените шаблоны / js, чтобы сделать то, что вы хотите. Дополнительный бонус заключается в том, что вы получите множество других функций бесплатно (например, возможность иметь панель управления, если вы подключите ее с помощью django-admin-tools ).

django широко использует jquery в своих админах, и у них есть собственное пространство имен jquery (django.jQuery); поэтому, если вы планируете создавать собственные виджеты, убедитесь, что вы используете правильное пространство имен, чтобы избежать странных проблем.

0 голосов
/ 16 июля 2019

Мне удалось настроить виджет даты по умолчанию в админке Django. Я прошел два урока (из Простой лучше, чем сложный и Пользовательский виджет Django )

  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, как показано в приведенном выше коде. В этом случае это добавляет стили для пользовательского выбора даты .

  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>
  1. Вам необходимо указать, какой виджет использовать в поле даты при регистрации вашей модели в админке Django (используйте formfield_overrides)
@admin.register(YourModel)
class YourModelAdmin(admin.ModelAdmin):
    formfield_overrides = {models.DateField: {"widget": CustomDatePickerInput}}

Как только это будет выполнено, у вас будет собственный виджет для дат в админке Django. Помните, что это всего лишь руководство, вы можете пойти дальше, ознакомившись с двумя указанными мной уроками.

Примечание: реализация этого виджета также поддерживает интернационализацию.

...