2011-12-07 6 views
4

が、私はこのようになりますモデルがあります: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: 
     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である(これはどこですそれは醜く見えます)

@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は、これを行う正しい方法ですか、これを行うには良い方法がありますか?

J

答えて

3

が本当にモデルやフォームを定義するという点で方法を考えることはできませんが、あなたは、いくつかのラインを削減することができます 次のようにします。

mfs = [movie_screener_form, movie_trailer_form, movie_poster_form] 

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

おかげであなたができることの一つは、初期化時に引数としてそれを渡すことによって、フォーム自体にビューから、それを必要とするモデルの形で映画インスタンスの設定を移動しています形。ここでは一の実施の例ですが、これはおそらく、個別に各1でオーバーライドを行うために持っていることからあなたを節約し、他の人が継承できる基本フォームクラスにすることができます。このコードはどれも、私はちょうど...大声で考えています、テストされていない

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() 
0

私はその後、正しく設計を理解している場合:

  • すべての映画は、クリーナー
  • 作品が複数のクリーナー
  • を持ったことのない映画トレーラー
  • を持っているかもしれません
  • 作品は、映画がポスター
  • がある可能性がありますつ以上のトレーラー
  • を持っていることはありません0
  • 映画には複数のポスターがありません

これは正しいですか?

私の仮定が正しいならば、あなただけの作品のモデルのすべてのフィールドを持つことができます。 (トレーラーとポスターは、すでにNULL可能ですので、彼らはオプションです)。したがって、モデルとフォームは1つだけ必要です。

関連する問題