2009-06-02 4 views
0

У меня странная проблема с встроенными формами admin admin. У меня есть две моделей, основной проект и видео с ManyToMany отношения корыта VideoLINK, becouse мне нужно, чтобы иметь возможность увязки различного количества видео для Project и многий проекта Видео:Проблема создания нового родового связанного объекта внутри администратора общие встроенные формы

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) в 2-х направлениях:

  • выберите Видео в админ инлайн форм (! Это работает очень хорошо)
  • определить 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 только что созданный и синхронизированный.

И еще одна очень странная проблема: я не могу найти родительский экземпляр (основной объект проекта) внутри этого чистый метод. Если я делаю то же самое с простыми объектами ManyToMany (без общих отношений и generic.GenericTabularInline форм), я вижу как поля видео, так и проекта внутри моей встроенной формы, но в общем случае у меня этого нет.

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

ответ

0

Решить эту проблему очень просто, добавьте требуемый = 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 

    .... 

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