应该在Django中使用GET / POST或基于类的视图的特定方法吗?

时间:2014-06-11 15:00:14

标签: django django-views

我只是想知道你认为Django中基于类的视图的最佳实践是什么。

一方面,你有类似的东西使用GET和POST。

class User_Logout(View):

    def get(self, request):
        auth.logout(request)
        return HttpResponseRedirect(reverse('frontend-login'))

这将映射到包含以下内容的urls.py:

from frontend.views import User_Logout

urlpatterns = patterns('',
    url(r'logout$', User_Logout.as_view(), name="frontend-logout"),
    )

或者,使用特定方法的东西。例如,我可以创建一个名为Score_Dashboard(View)的类,将与分数相关的每个页面封装为该类的方法。

有些事情......

class Scores(View):

    def score_one(self, request):
        return HttpResponseRedirect('http://www.youtube.com')


    def score_two(self, request):
        return HttpResponseRedirect('http://www.youtube.com')

然后将这些作为urls.py中每个类的实例的方法调用:

from views import Scores

scores = Scores()

urlpatterns = patterns('',
    url(r'score_one$', scores.score_two, name="score_one"),
    url(r'score_two$', scores.score_two, name="score_one"),
    )

所以我的问题是,哪一个更适合'甚至可能更好的'为什么?

另一种问这个问题的方法是,每个页面都应该有自己的类吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

如果您不需要使用基于类的视图,请不要使用它。

视图的最简单定义是使用函数。您的视图应该已按照应用进行组织,因此您无需创建其他子组(或者如果确实想要在应用内部组织视图,只需创建两个不同的视图文件):

def score_one(request):
    return HttpResponseRedirect('http://www.youtube.com')


def score_two(request):
    return HttpResponseRedirect('http://www.youtube.com')

如果您正在扩展Django提供的内置类,制作对象列表,更改表单等,则应该颠倒CBV。

答案 1 :(得分:1)

关于您的问题,您可以更轻松地在网址中捕获不同的args并在一个视图中处理它们:

def scores(request, score):
    if score == "score_one":
        # do something

    if score == "score_two":
        # do something else

urlpatterns = patterns('',
    url(r'(?P<score>score_one|score_two)$', scores, name="scores"),
)

在这种情况下使用基于类的视图可能不需要(特别是如果你只是重定向)。