我有一个模型书和模型评论(使用ForeignKey to Book)。我想创建一个视图,其中包含与书籍(DetailView)相关的所有数据,并添加显示和创建评论的功能。我提出了这个代码,但不知道这是一个好习惯,也许我应该去寻找不同的东西:
class BookDetailView(CreateView):
template_name = 'books/book_detail.html'
form_class = ReviewForm
def get_context_data(self, *args, **kwargs):
context = super().get_context_data(*args, **kwargs)
slug = self.kwargs.get('slug')
obj = Book.objects.get(slug__iexact=slug)
if get_language() == 'es':
context['reviews'] = obj.review_set.all().filter(language__iexact='es')
else:
context['reviews'] = obj.review_set.all().filter(language__iexact='en')
if len(context['reviews']) == 0:
context['is_empty'] = True
context['object'] = obj
return context
def form_valid(self, form):
obj = form.save(commit=False)
return super().form_valid(form)

模板:
{% extends "base.html" %}
{% load i18n %}
{% block content %}
<h1>{{object.title}}</h1>
<h2>{% trans "Reviews section" %}</h2>
{% for review in reviews %}
<b>{{review.title}}
{% endfor %}
<h2>Add a review!</h2>
{% include "form.html" with form=form %}
{% endblock content %}
&#13;
最后是url:url(r&#39; ^(?P [\ w - ] +)/ $&#39;,...)
您怎么看?
谢谢你的时间!
答案 0 :(得分:1)
我曾做过类似的事情。但是使用DetailView并将ReviewForm添加到上下文中并添加了一个处理发布数据的方法。像这样:
class BookDetailView(DetailView):
model = Book
def get_context_data(self, *args, **kwargs):
ctx = super().get_context_data(*args, **kwargs)
language = get_language()
ctx.update({
'reviews': ctx['book'].review_set.all().filter(language__iexact=language),
'form': ReviewForm()
})
return ctx
def post(self, *args, **kwargs):
self.object = self.get_object(self.get_queryset())
form = ReviewForm(self.request.POST)
if form.is_valid():
form.instance.book = self.object
form.save()
return HttpResponseRedirect(self.object.get_absolute_url())
else:
ctx = self.get_context_data(**kwargs)
ctx.update({'form': form})
return self.render_to_response(ctx)
我想这需要更多代码来处理表单,但奖励是你可以设置相关的书(用户不能摆弄那些表单数据)。
请注意,您不必指定template_name
,因为它是自动正确的。