Джанго - Как предварительно заполнить поля формы администратора - PullRequest
22 голосов
/ 09 февраля 2009

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

Тем не менее, я также хотел бы сделать другие автоматические предпопуляции на основе даты. Например, у меня есть поле URL, и я хочу, чтобы оно автоматически устанавливалось на http://example.com/20090209.mp3, где 20090209 - ГГГГММДД.

Я также хотел бы иметь текстовое поле, которое автоматически начинается с чего-то вроде «Здравствуйте, меня зовут автор», где автор - имя текущего пользователя. Конечно, я также хочу, чтобы человек мог редактировать поле. Смысл в том, чтобы просто сделать так, чтобы пользователю было легче заполнять форму администратора, а не просто иметь полностью автоматические поля.

Ответы [ 7 ]

32 голосов
/ 04 июня 2010

Я знаю, что вы можете предварительно заполнить некоторые значения через GET, это будет что-то вроде этого

http://localhost:8000/admin/app/model/add/?model_field=hello

У меня есть некоторые проблемы с полями даты, но, возможно, это может помочь вам.

15 голосов
/ 14 января 2013

Я недавно использовал для этой цели метод Джанго ModelAdmin.get_form .

class MyModelAdmin(admin.ModelAdmin):
    def get_form(self, request, obj=None, **kwargs):
        form = super(MyModelAdmin, self).get_form(request, obj, **kwargs)
        form.base_fields['my_field_name'].initial = 'abcd'
        return form

Yout должен быть осторожен с побочными эффектами, так как вы управляете base_fields напрямую.

13 голосов
/ 10 февраля 2009

Встроенная функция Django prepopulated_fields жестко запрограммирована, чтобы ее нельзя было использовать для использования в более общих целях.

Вам потребуется написать свою собственную функцию Javascript, чтобы выполнить предварительное заполнение. Лучший способ включить его на страницу администратора - включить его в внутренний класс Media пользовательской формы или Widget . Затем вам нужно настроить подкласс ModelAdmin для использования пользовательской формы или виджета. Наконец, вам нужно будет визуализировать некоторый встроенный Javascript вместе с каждым предварительно заполненным полем, чтобы зарегистрировать обработчик onchange и сообщить ему, из какого другого поля нужно заполнить; Я хотел бы сделать это через пользовательский виджет. Чтобы сделать его красивым и декларативным, вы можете использовать пользовательский атрибут ModelAdmin (похожий на prepopulated_fields) и переопределить ModelAdmin.formfield_for_dbfield, чтобы создать виджет и передать информацию о том, из какого поля он должен предварительно заполняться.

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

3 голосов
/ 10 февраля 2009

Вы можете переопределить стандартное поле администратора django, заменив его полем формы по вашему выбору.

Проверьте это: Добавить пользовательскую проверку администратору

3 голосов
/ 10 февраля 2009

Я также хотел бы иметь текстовое поле это автоматически начинается с что-то вроде "Здравствуйте, меня зовут автор».

Ознакомьтесь с документами: http://docs.djangoproject.com/en/dev/ref/models/fields/#default

Вы можете использовать CharField () или TextField () в вашей модели и установить эту опцию, которая установит текст по умолчанию. default также может быть вызываемой функцией.

Что-то вроде: models.CharField (max_length = 250, default = "Текст по умолчанию")

2 голосов
/ 10 февраля 2009

Работа со слагом осуществляется с помощью JavaScript.

Так что вам нужно переопределить шаблоны в админке, а затем заполнить поля javascript. Дата должна быть тривиальной, но я не знаю, как вы должны получить имя зарегистрированного пользователя для сценария (не то, чтобы я очень усердно думал, но вы получите дрейф :)).

1 голос
/ 14 июня 2017

Я попробовал несколько из этих ответов, и ни один из них не сработал. Я просто хотел подготовить поле с другим полем из связанной модели. Взяв этот ответ в качестве отправной точки, я наконец попытался манипулировать объектом экземпляра модели (здесь obj) напрямую, и это сработало для меня.

class MyModelAdmin(models.ModelAdmin):

    def get_form(self, request, obj=None, **kwargs):
        form = super(MyModelAdmin, self).get_form(request, obj, **kwargs)
        if not obj.some_model_field:
            obj.some_model_field = obj.related_model.prepopulating_model_field

        return form
...