2009-02-09 2 views
17

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

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

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

ответ

2

Управление слизнями выполняется с помощью javascript.

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

2

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

Заканчивать документацию по адресу: http://docs.djangoproject.com/en/dev/ref/models/fields/#default

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

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

+1

Я не думаю, что это соответствовало бы требованиям. Идея состоит в том, чтобы предварительно заполнить одно поле, основанное на только что введенном значении другого, все в Javascript. Вызываемые значения по умолчанию на стороне сервера не помогут. –

+0

@ Карл - это имеет смысл, я просто так не читал. Благодарю. –

3

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

Проверьте это: Add custom validation to the admin

12

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

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

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

+0

+1 для разрушения, как все работает. – tatlar

24

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

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

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

+0

Ну, я этого никогда не знал! Спасибо: D –

+0

Это GENIUS! Как вы узнали? Docs? –

+0

lol, я даже не помню – sacabuche

10

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

0

Я пробовал несколько из этих ответов, и никто из них не работал. Я просто хотел переполнять поле другим полем из связанной модели. Принимая 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 
Смежные вопросы