У меня модель зарегистрирована в админке. Одно из его полей - длинное строковое выражение. Я хотел бы добавить настраиваемые поля формы на страницу добавления / обновления этой модели в админке, чтобы на основе значений этих полей я построил длинное строковое выражение и сохраню его в соответствующем поле модели.
Как я могу это сделать?
ОБНОВЛЕНИЕ: в основном я строю математическое или строковое выражение из символов, пользователь выбирает символы (это настраиваемые поля, которые не являются частью модели), и когда он нажимает кнопку «Сохранить», я создаю представление строкового выражения из список символов и сохранить его в БД. Я не хочу, чтобы символы были частью модели и БД, только окончательное выражение.
fields = '__all__'
в свойMeta
класс, иначе django жалуется:Creating a ModelForm without either the 'fields' attribute or the 'exclude' attribute is deprecated
YourModelAdmin.list_display[0], 'extra_field' is not a callable or an attribute of 'YourModelAdmin' or found in the model 'YourModel'.
AttributeError: Unable to lookup "extra_field"...
, попробуйте добавитьlabel
кextra_field
определению. Похоже, что django пытается «угадать» метку для него, глядя наModel
иModelAdmin
для определения такого атрибута.Unknown field(s) (extra_field) specified for YourModel. Check fields/fieldsets/exclude attributes of class YourModelAdmin.
. Обходной путь для этогоextra_field = forms.CharField(widget=forms.HiddenInput())
Это можно сделать в админке, но это не очень простой способ. Кроме того, я хотел бы посоветовать сохранить большую часть бизнес-логики в своих моделях, чтобы вы не зависели от администратора Django.
Может быть, было бы проще (а может быть, даже лучше), если бы в вашей модели было два отдельных поля. Затем добавьте к своей модели метод, который их объединяет.
Например:
Затем в админке вы можете добавить поле
combined_fields()
только для чтения:Если вы хотите сохранить
combined_fields
в базе данных, вы также можете сохранить его при сохранении модели:источник
save()
методе модели , проверяйте обновления моего ответа.Django 2.1.1 Первый ответ заставил меня наполовину ответить на мой вопрос. Это не помогло мне сохранить результат в поле моей реальной модели. В моем случае мне нужно текстовое поле, в которое пользователь может вводить данные, а затем, когда произойдет сохранение, данные будут обработаны, а результат будет помещен в поле модели и сохранен. В то время как исходный ответ показал, как получить значение из дополнительного поля, он не показал, как сохранить его обратно в модель, по крайней мере, в Django 2.1.1.
Это берет значение из несвязанного настраиваемого поля, обрабатывает и сохраняет его в моем реальном поле описания:
источник
вы всегда можете создать новый шаблон администратора и делать то, что вам нужно, в своем admin_view (переопределите URL-адрес администратора, добавив его в свой admin_view):
источник
Если вы хотите сохранить в модели только объединенное поле, а не два отдельных поля, вы можете сделать что-то вроде этого:
form
атрибут на вашемModelAdmin
( https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.form )save_formset
методе на вашемModelAdmin
( https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.save_model )Я никогда не делал ничего подобного, поэтому не совсем уверен, как это сработает.
источник