Подтвердить что ты не робот

Django - Как заполнять поля формы администратора

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

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

Я также хотел бы иметь текстовое поле, которое автоматически начинается с чего-то типа "Hello my name is author", где автор является текущим именем пользователя. Конечно, я также хочу, чтобы человек мог редактировать поле. Дело в том, чтобы просто сделать так, чтобы пользователь мог легко заполнить форму администратора, а не просто иметь полностью автоматические поля.

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

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

Ответ 3

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

Ответ 5

Обработка пропусков выполняется с помощью javascript.

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

Ответ 6

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

Проверьте документы: http://docs.djangoproject.com/en/dev/ref/models/fields/#default

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

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

Ответ 7

Я попробовал несколько из этих ответов, и никто из них не работал. Я просто хотел переполнять поле другим полем из связанной модели. Взяв this в качестве отправной точки, я, наконец, попытался напрямую манипулировать объектом экземпляра модели (здесь 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