Django向ModelForm添加ManyToManyField

2024-04-25 11:59:32 发布

您现在位置:Python中文网/ 问答频道 /正文

很抱歉,这已经是这个问题的第一千个问题了,但我还是看不到隧道尽头的亮光。在

假设我有两个模型:

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)

如你所见,我想要一个有视频的频道。所以如果我用这样的模型来做视频广告

^{pr2}$

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

谢谢, 菲利普


Tags: name模型truemodeltitlemodelsvideo频道
3条回答

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

可能是这样的

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

在视图中进行验证。使用Model save()方法保存已发布表单中包含的信息。在

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

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

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


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

如果你想用一个简单的下拉菜单来选择一个频道,为什么视频和频道之间是多对多的关系呢?在

相关问题 更多 >