У меня странная проблема с обычными встроенными формами администратора. У меня есть две модели: основной проект и видео с отношением ManyToMany через VideoLink, потому что мне нужно иметь возможность связывать разное количество видео с проектом и много проектов с видео:
class VideoLink(models.Model):
content_type = models.ForeignKey(ContentType)
object_id = models.PositiveIntegerField()
content_object = generic.GenericForeignKey('content_type', 'object_id')
video = models.ForeignKey(Video)
class Project(models.Model):
name = models.CharField(max_length=50)
image_set = generic.GenericRelation('Image')
Я не показывал здесь модель видео, но это не важно для моего вопроса.
Все, что мне нужно, это определить новый связанный объект (VideoLink), связанный с основным объектом (Project), двумя способами:
- выберите Видео внутри встроенных форм администратора (это работает очень хорошо!)
- определить URL нового видео в поддельном поле video_url, создать новый объект Video и создать новый объект VideoLink между основным (Project) и новым (Video) объектами.
Для второго случая мне нужно установить среднюю функциональность. Он будет обрабатывать URL нового видео (например, http://www.youtube.com/watch?v=WIXVzeB0DUo),, создавать новый объект Video и синхронизировать его с youtube.com. Я думаю, что лучший способ - поместить это в форму AdminVideoLink , чистый метод , могу ли я право
Итак, я написал этот код:
class VideoForm(forms.ModelForm):
# new field for absolute video urls
video_url = forms.CharField()
def clean(self):
cleaned_data = self.cleaned_data
if not cleaned_data.get('id') and not cleaned_data.get('video') and cleaned_data.get('video_url'):
... some extra functionality:
1) get id from video_url
2) create new Video object with id
3) define cleaned_data['video'] = <Video object>
....
return cleaned_data
class VideoInline(generic.GenericTabularInline):
model = VideoLink
form = VideoForm
class ProjectAdmin(admin.ModelAdmin):
inlines = [VideoInline]
Но каждый раз после сохранения формы внутри встроенной формы администратора появляется сообщение об ошибке: рядом с видеообъектами выделяется «поле обязательно для заполнения» (мой перевод). Но я установил это поле в моем чистом методе. Я проверяю это: self.cleaned_data ['video'] содержит мой новый объект Video, только что созданный
и синхронизированы.
И еще одна очень странная проблема: я не могу найти родительский экземпляр (основной объект Project) внутри этого чистого метода . Если я делаю то же самое с простыми объектами ManyToMany (без родовых отношений и форм generic.GenericTabularInline), я вижу поля видео и проекта внутри встроенной формы, но в общем случае у меня их нет.
Я проверил связанный пост , но не нашел ответа.