从DetailView调用CreateView

时间:2016-06-08 23:10:13

标签: django django-views

在url.py中我有以下几行:

url(r'^(?P<slug>[\w-]+)/*$', ViewPage.as_view(), name='view'), 
url(r'^(?P<slug>[\w-]+)/__create$', CreatePage.as_view(), name='create'),

并在views.py中:

class ViewPage(DetailView):
    model = Page
    slug_field = 'url'

    def get_object(self, *args, **kwargs):
        if getattr(self, 'object', None):
            return self.object
        return super(ViewPage, self).get_object(*args, **kwargs)

    def get(self, request, *args, **kwargs):
        try:
            self.object = self.get_object()
        except Http404:
            # return custom template
            return reverse('create', kwargs=kwargs)
        context = self.get_context_data(object=self.object)
        return self.render_to_response(context)

class CreatePage(CreateView):
    model = Page
    slug_field = 'url'

此代码的主要目标是在对象不存在的情况下调用CreatePage。 但在线&#34;反向(&#39;创造&#39;,kwargs = kwargs)&#34;我收到了错误: &#39; STR&#39;对象没有属性&#39; get&#39;

据我所知,我无法正确传达变量kwargs。

所以我的问题:

1) May be other way to do what I want?
2) Or how to properly pass kwargs?

2 个答案:

答案 0 :(得分:0)

首先,了解此错误有助于您的查看功能,而不是reverse。因此,您有一个URL,它没有正确格式化。

django视图必须返回HttpResponse类型或子类,不能返回字符串。您可以在响应HttpResponse("my string")中返回一个字符串,但不能直接返回字符串。

在您的情况下,请返回HttpResponseRedirect

return http.HttpResponseRedirect(reverse(...))

答案 1 :(得分:0)

另一种选择是使用django的快捷方式重定向功能。

from django.core.urlresolvers import redirect
from django.shortcuts import redirect # <---

def foo(request, *a, **kw):
    return redirect(reverse("bar", kw=kw)) # <---

我个人喜欢基于功能的风格。