2009-06-02 25 views
0

我对管理员通用内联表单有个奇怪的问题。我有两个型号,主要项目和视频多对多关系槽录象,becouse我需要能够不同数量的视频投影和许多项目链接到视频:在管理员通用内联表单中创建新的通用相关对象的问题

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') 

我没有表现出视频模式这里,但这对我的问题并不重要。

所有我需要的是通过两种方式来定义链接到主对象(项目)新的相关对象(视频链接):

    管理内嵌形式里面
  • 选择视频(!这个作品非常好)
  • 在假video_url字段中定义新视频的URL,创建新的Video对象并在主(Project)和新(Video)对象之间创建新的VideoLink对象。

对于第二种情况,我需要设置中间功能。它会处理新视频的网址(如http://www.youtube.com/watch?v=WIXVzeB0DUo),创建新的视频对象并将其与youtube.com同步。我认为最好的办法 - 把这个放到AdminVideoLink的表格干净的方法,我说得对吗?

所以,我写了这个代码:

​​

但每节约的形式后,我看到管理在线表单中错误时间:用视频对象附近选择 - “字段是必须的”(我的翻译)。但是我在干净的方法中设置了这个字段。我检查它:self.cleaned_data ['video']包含我刚创建的新的Video对象 并同步。

另一个很奇怪的问题是:我在这个清理方法里面找不到父实例(主项目对象)。如果我用简单的ManyToMany对象(没有通用关系和泛型.GenericTabularInline表单)做同样的事情,我可以在我的内联表单中看到视频和项目字段,但是在通用情况下,我没有它。

我查过了相关的post,但没有找到答案。

回答

0

解决这个问题很简单,只需添加需要=假到在线表格:

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对象后手动。

相关问题