2014-01-28 56 views
3

考慮以下幾點:Django的類通用視圖重定向

urls.py:

urlpatterns = patterns('', 
    ('^test/$', ClassView.as_view()), 
) 

views.py:

class ClassView(View): 
    def get(self, request): 
     return HttpResponse("test") 
    def post(self, request): 
     # do something 
     return redirect(ClassView.get(request)) # What should I do to redirect to a class here without specifying the path? 

我想重定向到ClassView中的get功能(/測試/),但是當我嘗試上述時,我得到:

NoReverseMatch at /test/ 

所以它顯然找到了網址,但說沒有匹配?

回答

5

你應該只是命名你的urlpattern並重定向到那個,這將是最Django-ey的方式來做到這一點。

它不記錄(所以不能保證將來的Django版本的工作),但redirect快捷方式可以採取視圖功能,讓您可以幾乎redirect(ClassView.as_view()) ......我說的差不多,因爲這並不實際工作 - 每次撥打電話as_view()時,您都會收到一個新的視圖函數返回,因此redirect不會將其識別爲與您的urlconf中的視圖相同。

所以,做你想做什麼,你必須更新你的URLconf像這樣:

from .views import test_view 

urlpatterns = patterns('', 
    ('^test/$', test_view), 
) 

而在你的views.py

class ClassView(View): 
    def get(self, request): 
     return HttpResponse("test") 

    def post(self, request): 
     # do something 
     return redirect(test_view) 

test_view = ClassView.as_view() 

但我仍然認爲你應該這樣做另一種方式:

urlpatterns = patterns('', 
    url('^test/$', ClassView.as_view(), name="test"), 
) 

class ClassView(View): 
    def get(self, request): 
     return HttpResponse("test") 

    def post(self, request): 
     # do something 
     return redirect("test") 
+0

如果'post'方法中沒有任何自定義屬性,那麼更簡單的方法是使用類似'django.views.generic.edit.FormMixin'的mixin聲明'ClassView',然後添加'success_url'類成員聲明, 'success_url = reverse_lazy('test')'。那麼你完全可以省略'post'的聲明。 – nmgeek

+0

@nmgeek是的,好點! ......儘管OP確實在'post'方法中有'#做些什麼'的評論,這表明可能有一些自定義的東西正在發生 – Anentropic

1

可能是您應該爲您的urlpattern設置名稱並重定向到該名稱?

+0

這是一種選擇,但我希望只是在可能的情況下重定向到類名。 – olofom

+0

正如@anentropic回答的,可以重定向到預先實例化的視圖類。 但是,如果你在項目的其他地方使用它,你的重定向可能會被破壞,因爲Django不知道哪個urlpattern是正確的。 – oxyum

0

嘗試返回self.get()。我沒有測試。但作爲一個Python代碼,它應該工作。如果你只想執行這些語句,請使用它。這不會返回我認爲的任何HTTP 302狀態。

0
def post(self, request, *args, **kwargs): 
    return HttpResponseRedirect(request.path) 

這將重定向到相同的URL作爲您post(),然後由您get()得到處理。