Django多种模型,一种形式 [英] Django multiple models, one form

查看:69
本文介绍了Django多种模型,一种形式的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个看起来像这样的模型:

I have a model that looks like this:

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',)

这是我的views.py(看起来很丑)

And here is my views.py (this is where it looks ugly)

@login_required
def create_movie(request, template_name="explore/create_movie.html"):
    if request.method == 'POST':
        movie_form = MovieForm(data=request.POST)
        movie_screener_form = MovieScreenerForm(data=request.POST, files=request.FILES, prefix="a")
        movie_trailer_form = MovieTrailerForm(data=request.POST, files=request.FILES, prefix="b")
        movie_poster_form = MoviePosterForm(data=request.POST, files=request.FILES, prefix="c")

        if movie_form.is_valid() and movie_screener_form.is_valid() and movie_trailer_form.is_valid():
            movie_form.instance.user = request.user
            movie = movie_form.save()

            movie_screener_form.save(commit=False)
            movie_screener_form.instance.movie = movie
            movie_screener_form.save()

            movie_trailer_form.save(commit=False)
            movie_trailer_form.instance.movie = movie
            movie_trailer_form.save()

            movie_poster_form.save(commit=False)
            movie_poster_form.instance.movie = movie
           movie_poster_form.save()

            url = urlresolvers.reverse('explore')
            return redirect(url)
    else:
        movie_form = MovieForm(instance=request.user, label_suffix='')
        movie_screener_form = MovieScreenerForm(prefix="a", label_suffix='')
        movie_trailer_form = MovieTrailerForm(prefix="b", label_suffix='')
        movie_poster_form = MoviePosterForm(prefix="c", label_suffix='')

context = RequestContext(request, locals())
return render_to_response(template_name, context)

我的views.py似乎非常重复,这是执行此操作的正确方法还是有更好的方法?

My views.py seems very repetitive, is this the right way to do this or is there a better way to do this?

谢谢

J

推荐答案

在定义方面真的想不出办法模型或表格,但您可以使用以下内容减少一些行。

Can't really think of a way in terms of defining the models or forms, but you can cut down on some lines with the following.

mfs = [movie_screener_form, movie_trailer_form, movie_poster_form]

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

这篇关于Django多种模型,一种形式的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆