2017-02-08 6 views
1

python/djangoの新機能。私はクラスベースのビューを使用しています。私はVideoという名前のオブジェクトを持っており、評価を作成することができます。私はVideoDetailViewを持っていて、その同じページに私はを別のページに持ってきて、DetailViewにあった(なぜなら、ミックスインを混乱させたくないからページ)。テンプレート間でオブジェクト主キーを渡すdjango

は、どのように私はそれが評価DetailViewにあったVideoオブジェクトのためのものであることを知っているの評価を提出するときにDetailViewVideoオブジェクトへの参照を取得しておく/ことができますか?

class Video(models.Model): 
    title = models.CharField(max_length=100, default="Community Video ") 

class Rating(models.Model): 
    rate_choice = ((1, '1'), (2, '2'), (3, '3'), (4, '4'), (5, '5')) 
    rate_value = models.IntegerField(default=5, choices=rate_choice) 
    video = models.ForeignKey('Video', related_name='video', null=True, default=1) 

views.py

class VideoView(DetailView): 
    model = Video 
    template_name = 'video_view.html' 


class RatingView(CreateView): 
    model = Rating 
    template_name = 'rating_create.html' 
    fields = ['rate_value', 'video'] 

models.pyは基本的に私は私がvideo_viewrating_createにテンプレートから行くとき私と一緒に行くことにVideoの主キーをしたいです。私は関数ベースのビューを使用することを考えています、クラスビューは私を混乱させています。

urls.py:

urlpatterns = [ 
    url(r'^upload', UploadVideo.as_view(), name='upload'), 
    url(r'^(?P<pk>[0-9]+)/$', VideoView.as_view(), name='videoview'), 
    url(r'^(?P<pk>[0-9]+)/ratings', RatingView.as_view(success_url='success_yea'), name='rating_view'), 
    url(r'^success', upload, name='success_yea') 
] 
+0

関数ベースのビューを理解しやすくしても、問題はありません。機能ベースビューまたはクラスベースビューのどちらを選択する場合でも、最初に行うことはあなたのURLを設定することです。これまでに何を持っていますか? – Alasdair

+0

私は自分の投稿にURLを追加しました。私はURL名にプライマリキーを追加することでいくつかのことを試しましたが、ここで私が持っているものは私のものです – ratrace123

答えて

0

あなたはvideo_view.htmlテンプレートファイルで

url(r'^(?P<pk>[0-9]+)/ratings', RatingView.as_view(), 

のようなものは、現在のビデオIDでそれを逆に、あなたのurls.pyのパラメータとしてこれを渡すことができます。あなたのビューで、その後

そして:あなたのURLはよさそうだ

class RatingView(CreateView): 
    model = Rating 
    template_name = 'rating_create.html' 
    fields = ['rate_value'] 
    success_url = reverse_lazy('success_yea') 

    def form_valid(self, form): 
     form.instance.video = get_object_or_404(Video, id=self.kwargs.get('pk')) 
     return super(RatingView, self).form_valid(form) 
+0

URLの 'Video'のプライマリキーを入れてから' kwargs'を使ってその主キーを取り出し、そのオブジェクトをビューに戻しますか?次に、ビューの右側に別のメソッドを使って 'get_init'で定義されたオブジェクトにレーティングを保存する必要がありますか? – ratrace123

+0

はい、基本的にはアイデアです。カスタムModelFormを作成して、ビデオフィールドを非表示の入力にするか、form_validメソッドをオーバーライドして、モデルを自分自身を正しいビデオで保存することもできます。 – Mounir

0

、あなたはすでにそこにPKを持っています。あなたのビューで

url(r'^(?P<pk>[0-9]+)/ratings', RatingView.as_view(), name='rating_view'), 

あなたはそれを編集可能にしたくないので、あなたは、フィールドのリストからvideoを削除する必要があります。

form_validをオーバーライドし、videoをフォームのインスタンスに設定することができます。上記のコードの

from django.shortcuts import get_object_or_404  
from django.urls import reverse 

class RatingView(CreateView): 
    model = Rating 
    template_name = 'rating_create.html' 
    fields = ['rate_value'] 
    # I recommend moving this here, to avoid splitting config between the view and the urls. 
    # You need reverse_lazy to turn the pattern name into the url 
    success_url = reverse_lazy('success_yea') 

    def form_valid(self, form): 
     # Fetch video from the db to check it exists 
     video = get_object_or_404(Video, pk=self.kwargs['pk']) 
     form.instance.video = video 
     return super(RatingView, self).form_valid(form) 

一つの欠点は、フォームが有効であるときにのみ、URLにPKを検証することです。すべてのリクエストのプライマリキーを検証する場合は、そのコードをディスパッチメソッドに移すことができます。

class RatingView(CreateView): 
    model = Rating 
    template_name = 'rating_create.html' 
    fields = ['rate_value'] 
    success_url = reverse_lazy('success_yea') 

    def dispatch(self, request, *args, **kwargs): 
     # Fetch video from the db to check it exists 
     self.video = get_object_or_404(Video, pk=self.kwargs['pk']) 
     return super(RatingView, self).dispatch(request, *args, **kwargs) 

    def form_valid(self, form): 
     form.instance.video = self.video 
     return super(RatingView, self).form_valid(form) 
+0

ok私はあなたが何を持っているのか少し混乱します。 'kwargs = super(RatingView、self)とは何ですか?get_form_kwargs()'は何ですか?唯一の 'kwarg'は' 'pk''ですか?そして私はどこかでインスタンスを開始する必要があります、私は本当にその行が何をしているのか分かりません。 – ratrace123

+0

これは、クラスベースのビューの短所の1つであることに注意してください。 'form_valid'や' get_form_kwargs'のようなメソッドを理解することなく、ビューを見たりフローを理解することはできません。代わりに 'form_valid'を使用するようにコードを変更しました。なぜなら、私はそれが少しきれいだと思うからです。 'return super(RatingView、self).form_valid(form)'を呼び出すと、 'CreateView'の' form_valid'メソッドが呼び出され、コードを複製する必要はありません。 – Alasdair

関連する問題