Django区分视图方法中的GET / POST请求

13

我之前使用的其他编程语言中,我可以在控制器中只有一个方法名称(例如:登陆),用注解属性设置方法类型(GET或POST)。比如在Spring MVC框架中,我只需拥有一个名为“login”的方法即可。 在Django中是否也能实现这种方法呢? 比如说,我有这个“login”方法:

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

这个方法是通过GET访问的,我需要声明一个新的方法,如login_post(request)来进行POST访问吗?还是应该检查第一个方法中的request.POST['value']是否为空,如果不为空,则为POST,如果为空,则应该是GET。我是Django的新手,你有什么建议吗?谢谢。

2个回答

13

不需要为每个请求创建函数,你可以直接“询问”请求:

你可以:

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')

两者都可以。此外,可以看一下基于类的视图作为另一种选择,它们非常有用。


12

正如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')

您可以使用类视图,就像这样:

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()),
]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接