Django区分视图中的get/post和#x27;s方法

Django区分视图中的get/post和#x27;s方法,django,model-view-controller,Django,Model View Controller,我一直在使用其他语言,在这些语言中,我可以为一个操作(比如登录)使用一个方法名(在控制器中)。例如,在SpringMVC中,我可以有一个名为“login”的方法,并通过注释属性设置方法类型(get或post)。 在Django这可能吗? 例如,我使用以下方法登录: def login(request): return render(request, 'login.html') 此方法是通过GET访问的,我是否需要声明新方法,即登录\u post(请求)以访问post?或者我应该检查re

我一直在使用其他语言,在这些语言中,我可以为一个操作(比如登录)使用一个方法名(在控制器中)。例如,在SpringMVC中,我可以有一个名为“login”的方法,并通过注释属性设置方法类型(get或post)。 在Django这可能吗? 例如,我使用以下方法登录:

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

此方法是通过GET访问的,我是否需要声明新方法,即登录\u post(请求)以访问post?或者我应该检查request.POST['value']在第一个方法中是否不为空,如果不为空则为POST,如果为空则应为GET。我是Django的新手,你的建议怎么样?谢谢。

无需为每个函数创建函数,您可以“询问”请求:

你可以:

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')
两人都很好。另外,作为一种选择,它们非常有用。

如中所述,另一种方法是使用基于类的视图

基于类的视图提供了另一种将视图实现为Python对象而不是函数的方法。它们不会取代基于功能的视图,但与基于功能的视图相比,它们具有一定的区别和优势:

  • 与特定HTTP方法(GET、POST等)相关的代码组织可以通过单独的方法而不是条件分支来解决
  • 诸如mixin(多重继承)之类的面向对象技术可用于将代码分解为可重用组件
因此,不要使用基于函数的视图(如其他答案中所述):

您可以使用基于类的视图,如下所示:

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')
使用基于类的视图时,URL.py将如下所示:

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

urlpatterns = [
    url(r'^login/', LoginView.as_view()),
]
# urls.py
from django.conf.urls import url
from myapp.views import LoginView

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