2012-07-17 63 views
1

对不起,这就像这个问题的第千个问题,但我仍然看不到隧道尽头的灯光。Django添加一个ManyToManyField到ModelForm

可以说我有两个型号:

class Video(models.Model): 
title = models.CharField(u"Titel",max_length=200) 
slug = AutoSlugField(populate_from='title',unique=True) 
date = models.DateField("Datum") 
description = models.TextField(u"Beschreibung") 
user = models.OneToOneField(User, blank=True, null=True) 

class Channel(models.Model): 
name = models.CharField(u"Name",max_length=30) 
slug = AutoSlugField(populate_from='name',unique=True) 
videos = models.ManyToManyField('videoportal.Video',related_name="contained_videos",blank=True,null=True) 
created = models.DateTimeField(auto_now_add=True) 
modified = models.DateTimeField(auto_now=True) 

正如你看到的我想有它的视频(S)的信道。所以,如果我的广告使用的ModelForm这样

class VideoForm(ModelForm): 
    class Meta: 
     model = Video 

我得到将不包含输入字段选择一个频道(当然不是),该形式的视频。那我该怎么做?我怎样才能在我的表单中有一个输入字段来选择一个下拉菜单的频道?

感谢, 菲利普

回答

1

如果一个视频只属于一个频道,只需将您的Video型号ForeignKey添加到您的Channel型号。如果它应该属于多个频道,我会在Video模型中使用ManyToManyField,正如已经建议的那样。

我认为这将适合上传视频并将其添加到频道的想法,远胜于其他方式。

+0

,您可以更改模型的结构您是对的,我认为这一切都是错误的,因为我想的很复杂。谢谢(和所有其他人)的帮助,我真的很感激它! – plaetzchen 2012-07-17 23:01:50

0

使用自定义窗体,而不是Django的的ModelForm。

大概是这样的,

class VideoForm(forms.Form): 
    title = forms.CharField() 
    description = forms.TextField() 
    channel = forms.ModelChoiceField(queryset= Channel.objects.all(), empty_label=None) 

就开始验证在视图中。使用Model save()方法保存包含在您发布的表单中的信息。

+0

确定你有任何代码或例子吗?我是否需要编写自己的save()方法等? – plaetzchen 2012-07-17 16:41:54

+0

无需编写自己的保存方法。 (例如'new_vid = Video(title = form.cleaned_data ['title']); new_vid.save(); new_vid.channel_set.add(your_selected_channel))' – machaku 2012-07-17 17:11:25

+0

您也可以通过在视频模型中添加'ManyToManyField'来代替频道模型 – machaku 2012-07-17 17:17:53

0

尝试把多对多字段中Video模型,并从Channel模型忽略它:


class Video(model.Model): 
    ... 
    channels = model.ManyToManyField('videoportal.Channel', related_name='videos') 
    ... 

如果你想要一个简单的下拉列表中选择一个通道,为什么它是一个多到多赫志视频和频道之间?

相关问题