Django在视图方法中区分get / post

Pin*_*ink 4 django model-view-controller

我一直在与其他语言一起工作,在其中我可以简单地为一个动作使用一个方法名(在控制器中)(比如说登录)。例如,在春季MVC中,我可以使用一种名为“登录”的方法,并通过注释属性设置方法类型(获取或发布)。在Django中有可能吗?例如,我有以下方法登录:

def login(request):
    return render(request, 'login.html')
Run Code Online (Sandbox Code Playgroud)

该方法是通过GET访问的,是否需要声明新方法(即login_post(request))以进行帖子访问?或者我应该检查第一种方法中的request.POST ['value']是否不为空,如果不是,则为POST;如果为空,则应为GET。我是Django新手,您的建议如何?谢谢。

小智 10

正如Django 文档中提到的,另一种方法是使用基于类的视图。

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

  • 与特定 HTTP 方法(GET、POST 等)相关的代码组织可以通过单独的方法而不是条件分支来解决。
  • 诸如mixin(多重继承)之类的面向对象技术可用于将代码分解为可重用组件。

因此,不要使用基于函数的视图(如其他答案中所述):

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')
Run Code Online (Sandbox Code Playgroud)

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

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')
Run Code Online (Sandbox Code Playgroud)

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

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

urlpatterns = [
    url(r'^login/', LoginView.as_view()),
]
Run Code Online (Sandbox Code Playgroud)


Cés*_*sar 6

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

您可以:

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

或者,可以假定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')
Run Code Online (Sandbox Code Playgroud)

两者都还好。另外,请看一下基于类的视图,它们非常有帮助。