Django将ManyToManyField添加到ModelForm

时间:2012-07-17 16:23:00

标签: python django django-forms

对不起,这就像这个问题的第1000个问题,但我仍然看不到隧道尽头的光。

假设我有两种模式:

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)

如您所见,我想要一个包含视频的频道。因此,如果我使用像这样的ModelForm来播放视频

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

我得到的表格不包含选择频道的输入字段(当然不包含)。那我该怎么做呢?如何在表单中输入一个输入字段来选择一个带有下拉菜单的频道?

谢谢, 菲利普

3 个答案:

答案 0 :(得分:1)

如果视频只属于一个频道,只需将Video模型ForeignKey提供给Channel模型。如果它应该属于多个频道,我会在ManyToManyField模型中使用Video,如已建议的那样。

我认为这符合上传视频并将其添加到频道的想法,远比用其他方式更好。

答案 1 :(得分: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()方法保存POST表单中包含的信息。

答案 2 :(得分:0)

尝试将ManyToMany字段放在Video模型中,并从Channel模型中省略它:


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

如果您想要一个简单的下拉列表来选择单个频道,为什么它是视频和频道之间的多对多关系?