2012-07-17 64 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') 
    ... 

如果你想要一個簡單的下拉列表中選擇一個通道,爲什麼它是一個多到多赫志視頻和頻道之間?

相關問題