Проблема создания нового общего родственного объекта внутри общих встроенных форм администратора - PullRequest
0 голосов
/ 02 июня 2009

У меня странная проблема с обычными встроенными формами администратора. У меня есть две модели: основной проект и видео с отношением 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), я вижу поля видео и проекта внутри встроенной формы, но в общем случае у меня их нет.

Я проверил связанный пост , но не нашел ответа.

1 Ответ

0 голосов
/ 03 июня 2009

Решить эту проблему очень просто, просто добавьте required = False во встроенную форму:

class VideoForm(forms.ModelForm):

    video_url = forms.CharField(required=False, widget=AdminVideoPreviewWidget())

    def __init__(self, *args, **kwargs):
        super(VideoForm, self).__init__(*args, **kwargs)
        self.fields['video'].required = False

    ....

С его помощью я могу заполнить видео поле вручную после создания и синхронизации нового объекта Video.

...