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)
无需为每个函数创建函数,您可以“询问”请求:
您可以:
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)
两者都还好。另外,请看一下基于类的视图,它们非常有帮助。
| 归档时间: |
|
| 查看次数: |
4324 次 |
| 最近记录: |