Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django多个模型,一种形式_Django - Fatal编程技术网

Django多个模型,一种形式

Django多个模型,一种形式,django,Django,我有一个这样的模型: class Movie(models.Model): title = models.CharField(max_length=200) slug = models.SlugField(max_length=200) user = models.ForeignKey(User) created_on = models.DateTimeField(default=datetime.datetime.now()) class Meta:

我有一个这样的模型:

class Movie(models.Model):
    title = models.CharField(max_length=200)
    slug = models.SlugField(max_length=200)
    user = models.ForeignKey(User)
    created_on = models.DateTimeField(default=datetime.datetime.now())

    class Meta:
        ordering = ['-title']

    def __unicode__(self):
        return self.title

class MovieScreener(models.Model):
    screener_asset = models.FileField(upload_to='movies/screeners/')
    movie = models.ForeignKey(Movie)

class MovieTrailer(models.Model):
    trailer_asset = models.FileField(upload_to='movies/trailers/', blank=True, null=True)
    description = models.TextField()
    movie = models.ForeignKey(Movie)

class MoviePoster(models.Model):
    poster_asset = models.FileField(upload_to='movies/posters/', blank=True, null=True)
    movie = models.ForeignKey(Movie)
class MovieForm(forms.ModelForm):
    class Meta:
        model = Movie
        exclude = ('user','created_on')

class MovieScreenerForm(forms.ModelForm): 
    class Meta:
        model = MovieScreener
        exclude = ('movie',)

class MovieTrailerForm(forms.ModelForm):
    class Meta:
        model = MovieTrailer
        exclude = ('movie',)

class MoviePosterForm(forms.ModelForm): 
     class Meta:
        model = MoviePoster
        exclude = ('movie',)
我的表格是这样的:

class Movie(models.Model):
    title = models.CharField(max_length=200)
    slug = models.SlugField(max_length=200)
    user = models.ForeignKey(User)
    created_on = models.DateTimeField(default=datetime.datetime.now())

    class Meta:
        ordering = ['-title']

    def __unicode__(self):
        return self.title

class MovieScreener(models.Model):
    screener_asset = models.FileField(upload_to='movies/screeners/')
    movie = models.ForeignKey(Movie)

class MovieTrailer(models.Model):
    trailer_asset = models.FileField(upload_to='movies/trailers/', blank=True, null=True)
    description = models.TextField()
    movie = models.ForeignKey(Movie)

class MoviePoster(models.Model):
    poster_asset = models.FileField(upload_to='movies/posters/', blank=True, null=True)
    movie = models.ForeignKey(Movie)
class MovieForm(forms.ModelForm):
    class Meta:
        model = Movie
        exclude = ('user','created_on')

class MovieScreenerForm(forms.ModelForm): 
    class Meta:
        model = MovieScreener
        exclude = ('movie',)

class MovieTrailerForm(forms.ModelForm):
    class Meta:
        model = MovieTrailer
        exclude = ('movie',)

class MoviePosterForm(forms.ModelForm): 
     class Meta:
        model = MoviePoster
        exclude = ('movie',)
这里是my views.py(这就是它看起来丑陋的地方)

My views.py似乎非常重复,这是正确的方法还是有更好的方法

谢谢


J

您可以做的一件事是,在初始化表单时,通过将其作为参数传入,将模型表单上需要电影实例的设置从视图移动到表单本身。下面是一个实现的示例,但这可能会被制作成一个其他人可以继承的基表单类,从而避免了您需要在每个实现中单独进行重写。这些代码都没有经过测试,我只是想大声说出来

class MovieScreenerForm(forms.ModelForm): 
    class Meta:
        model = MovieScreener
        exclude = ('movie',)

    def __init__(self, movie, *args, **kwargs):
        super(MovieScreen, self).__init__(*args, **kwargs)
        self.movie = movie

    def save(self, commit=True):
        instance = super(MovieScreenerForm, self).save(commit=False)
        instance.move = self.movie
        instance.save()

在定义模型或表单方面,我真的想不出一种方法,但是你可以用下面的方法减少一些行

mfs = [movie_screener_form, movie_trailer_form, movie_poster_form]

for mf in mfs:
    mf.save(commit=False)
    mf.instance.movie = movie
    mf.save()

如果我正确理解了您的设计,那么:

  • 每部电影都有一个编剧
  • 电影从来没有一个以上的编剧
  • 电影可能有预告片
  • 电影从来没有超过一个预告片
  • 电影可能有海报
  • 电影从来没有超过一张海报
是这样吗

如果我的假设是正确的,那么你可以得到电影模型上的所有字段。(预告片和海报已经可以为空,因此它们是可选的)。所以你只需要一个模型和一个表单