2015-11-06 123 views
3

我一直在使用其他语言,我可以简单地在一个动作(可以说是登录)中拥有一个方法名称(在控制器中)。例如,在Spring MVC中,我可以使用一种名为'login'的方法,并通过annotation属性设置方法类型(get或post)。 在Django中可能吗? 例如,我有这样的方法登录:Django区分get/post视图的方法

def login(request): 
    return render(request, 'login.html') 

这种方法是通过GET accesed,我是否需要申报后获得新的方法,即login_post(请求)?或者我应该检查如果request.POST ['值']不是空的第一个方法,如果它不是那么它是POST,如果它是空的,那么它应该是GET。我是Django的新手,你的建议如何?谢谢。

回答

3

没有必要创建函数为每一个,你可以在 “问” 的要求:

您可以:

def login(request): 
    if request.method == 'POST': 
     # Your code for POST 
    else: 
     # Your code for GET 
    return render(request, 'login.html') 

或者,你可以假设GET作为默认:

def login(request): 
    if request.method == 'POST': 
     # Your code for POST 
     # make sure to put a "return redirect" statement here 
    # Your code for GET 
    return render(request, 'login.html') 

两者都可以。另外,看看Class-based Views作为替代方案,它们非常有帮助。

0

Django documentation所述,另一种方法是使用基于类的视图。

基于类的视图提供了将视图实现为Python对象而不是函数的替代方法。相比基于函数的意见时,他们不取代基于函数的观点,但有一定的差异和优势:

  • 涉及到特定的HTTP方法(GET,POST等)的代码组织可以通过不同的方法来解决而不是条件分支。
  • 诸如mixins(多继承)的面向对象技术可用于将代码分解为可重用组件。的

因此,而不是使用基于函数的观点(在其他的答案中提到):

from django.shortcuts import render 

def login(request): 
    if request.method == 'POST': 
     # handle the post request 
    else: 
     # handle the get request 
    return render(request, 'login.html') 

你可以使用基于类的视图,像这样:

from django.shortcuts import render 
from django.views.generic import View 

class LoginView(View): 
    def post(self, request): 
     # handle the post request 
     return render(request, 'login.html') 

    def get(self, request): 
     # handle the get request 
     return render(request, 'template-path.html') 

当使用基于类的视图,您的urls.py将如下所示:

# urls.py 
from django.conf.urls import url 
from myapp.views import LoginView 

urlpatterns = [ 
    url(r'^login/', LoginView.as_view()), 
]