2017-10-21 3 views
0

私はDjangoを学んでいて、コメントフォームを正しく作ろうと壁に向かって頭を打っています。基本的に私が構築しているのはレシピアプリです。これは単なる練習ですが、誰かがレシピを投稿し、他の人がコメントできるという考えがあります。私はそれが基本的に働いているが、コメントが提出された後、リダイレクトをレシピ詳細ビューに戻す方法を考えることができません。Django作成コメントパスを渡す件名pk

私がpkのハードコードを使っていれば、そのpkを入手するだけです!ここで

は私のものです:

Portion of Recipes views.py: 

from django.shortcuts import render 
from django.contrib.auth.mixins import LoginRequiredMixin 
from django.views.generic import TemplateView, ListView, DetailView, CreateView, UpdateView, DeleteView, View 
from django.views.generic.detail import SingleObjectMixin 
from django.core.urlresolvers import reverse_lazy 

#from comments.models import Comment 
from .models import Recipe 
from comments.models import Comment 

from .forms import RecipeCreateForm 
from comments.forms import CommentFormTrial 
from comments.views import CommentCreateView 

class PersonalRecipeListView(LoginRequiredMixin,ListView): 

    def get_queryset(self): 
     return Recipe.objects.filter(owner=self.request.user) 

class RecipeDetailView(View): 
    def get(self, request, *args, **kwargs): 
     view = RecipeContent.as_view() 
     return view(request, *args, **kwargs) 

    def post(self, request, *args, **kwargs): 

     view = CommentCreateView.as_view() 
     return view(request, *args, **kwargs) 


class RecipeContent(DetailView): 
    model = Recipe 
    template_name = 'recipes/recipe_detail.html' 
    context_object_name = 'recipe_data' 


    def get_context_data(self, *args, **kwargs): 
     context = super(RecipeContent, self).get_context_data(*args, **kwargs) 
     print('-------------------') 
     print(self.kwargs.get('pk')) 
     qs= Comment.objects.filter(recipe=self.kwargs.get('pk')) 
     context['comments'] = qs 

     comment_form = CommentFormTrial 
     context['comment_form'] = comment_form 

     return context 

そして、私のコメントview.py:

from django.shortcuts import render, get_object_or_404 
from .models import Comment 
from django.http import HttpResponseForbidden 
from django.views.generic import ListView, CreateView 
from django.core.urlresolvers import reverse_lazy 
from .forms import CommentFormTrial 


# Create your views here. 
class CommentListView(ListView): 
    model = Comment 
    context_object_name = 'comments' 
    template_name='comments/testcomment.html' 


class CommentCreateView(CreateView): 
    model = Comment 
    form_class = CommentFormTrial 

    success_url = reverse_lazy('recipes:recipe-detail', kwargs = {'pk':10}) 

    def form_valid(self, form): 
     form.instance.owner = self.request.user 
     return super(CommentCreateView, self).form_valid(form) 

あなたは私がハードsuccess_urlでPKのための '10' にコーディングされている見ることができます。これを実行すると機能しますが、明らかにそのレシピにリダイレクトされるだけです。

現在、私はレシピを選択していますが、理想的ではないコメントモーダルをドロップダウンしてコメントしたいと思います。

すべてのヘルプは大歓迎です!

+0

コメントを投稿するためのフォームを「RecipeContent」ビューに追加します。フォームを作成し、コンテキストに追加します。 'pk'をテンプレートの隠しフィールドとしてインクルードし、' CommentCreateView'で直接アクセスできるようにします。そうすれば、ユーザーはプルダウンメニューを使用する必要はありません。 – dirkgroten

答えて

0

あなたのコメントには、リンク先のレシピのリファレンスが必要です。私はあなたのCommentモデルにForeignKeyRecipeがあると仮定していますか?

あなたのCommentCreateViewは、Recipeへのpkという追加の属性を受け取る必要があります。あなたのkwargsに既にそのキーがあり、それがあなたのCommentCreateViewに渡されているようです。

def get_success_url(self): 
    recipe = Recipe.objects.get(pk=self.kwargs.get('pk')) 
    return recipe.get_absolute_url() 

をし、クラスレベルでsuccess_urlを定義していません。だからあなたのCommentViewで、あなただけのオーバーライドする必要があります。

+0

ありがとうダーク私は本当に助けに感謝します。今働いている。乾杯! –