在django中组合Create和DetailView

时间:2018-02-20 18:23:52

标签: python django-views

我有一个模型书和模型评论(使用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;
&#13;
&#13;

最后是url:url(r&#39; ^(?P [\ w - ] +)/ $&#39;,...)

您怎么看?

谢谢你的时间!

1 个答案:

答案 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,因为它是自动正确的。