Правильный способ изменения данных перед сохранением модели через сайт администратора
Django 4.1
models.py
class Video(models.Model):
phrase_id = models.IntegerField(default=-1,
blank=False,
null=False,
validators=[MinValueValidator(0)])
# This field will be read only in the admin site.
# Its only purpose is to ensure cascade deletion.
_phrase = models.ForeignKey("vocabulary_phrases.Phrase",
on_delete=models.CASCADE,
default="",
blank=True,
null=True)
admin.py
class VideoAdmin(admin.ModelAdmin):
list_display = ["phrase_id", "name", ]
list_filter = ['phrase_id']
readonly_fields = ('_phrase',)
form = VideoForm
admin.site.register(Video, VideoAdmin)
forms.py
class VideoForm(ModelForm):
def clean(self):
if ("phrase_id" in self.changed_data) and self.cleaned_data.get("phrase_id"):
phrase_id = self.cleaned_data["phrase_id"]
_phrase = _get_phrase(phrase_id)
self.cleaned_data["_phrase"] = _phrase
return self.cleaned_data
class Meta:
model = Video
exclude = []
В админке пользователь вставляет целое число для phrase_id. Затем в форме администратора я хотел заменить self.clean_data на экземпляр фразы, который я извлекаю из базы данных.
Проблема в том, что после сохранения, поле _phrase пустое.
Вот документация: https://docs.djangoproject.com/en/4.1/ref/forms/validation/
Читать далее:
Метод clean() подкласса формы... Этот метод может вернуть совершенно другой словарь, который будет использоваться как очищенные_данные
Ну, я изменил clean_data, но, похоже, это не влияет на то, что сохраняется. Моя идея была такова: данные проверяются перед сохранением, подставьте очищенные_данные, тогда ваши собственные данные будут сохранены. Похоже, я ошибся
Могли бы вы помочь мне понять правильный способ изменения данных перед сохранением модели через админку сайта.