Django 创建评论查看 pass Subject pk
Django Create Comment View pass Subject pk
我正在学习 Django,并且一直在努力使评论表单正常工作。基本上我正在构建的是一个食谱应用程序。这只是练习,但想法是有人发布食谱,其他人可以对其发表评论。我基本上可以正常工作,但我不知道如何在提交评论后让重定向返回到食谱详细信息视图。
如果我在 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”。完成后它可以工作,但显然只会重定向到那个食谱。
目前我正在从评论模式的下拉菜单中选择我想评论的菜谱,这也不理想。
非常感谢任何帮助!
您的评论需要引用它们链接到的食谱。我假设您的 Comment
模型有 ForeignKey
到 Recipe
?
因此您的 CommentCreateView
需要接收一个额外的属性,即 pk
到 Recipe
。看起来您的 kwargs
已经拥有该密钥,该密钥已传递给您的 CommentCreateView
。所以在你的 CommentView
中,你只需要覆盖:
def get_success_url(self):
recipe = Recipe.objects.get(pk=self.kwargs.get('pk'))
return recipe.get_absolute_url()
并且不要在 class 级别定义 success_url
。
我正在学习 Django,并且一直在努力使评论表单正常工作。基本上我正在构建的是一个食谱应用程序。这只是练习,但想法是有人发布食谱,其他人可以对其发表评论。我基本上可以正常工作,但我不知道如何在提交评论后让重定向返回到食谱详细信息视图。
如果我在 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”。完成后它可以工作,但显然只会重定向到那个食谱。
目前我正在从评论模式的下拉菜单中选择我想评论的菜谱,这也不理想。
非常感谢任何帮助!
您的评论需要引用它们链接到的食谱。我假设您的 Comment
模型有 ForeignKey
到 Recipe
?
因此您的 CommentCreateView
需要接收一个额外的属性,即 pk
到 Recipe
。看起来您的 kwargs
已经拥有该密钥,该密钥已传递给您的 CommentCreateView
。所以在你的 CommentView
中,你只需要覆盖:
def get_success_url(self):
recipe = Recipe.objects.get(pk=self.kwargs.get('pk'))
return recipe.get_absolute_url()
并且不要在 class 级别定义 success_url
。