如何为 GET 和 POST 编写单独的视图
Posted
技术标签:
【中文标题】如何为 GET 和 POST 编写单独的视图【英文标题】:How to write separate views for GET and POST 【发布时间】:2013-05-25 04:18:01 【问题描述】:首先,我希望两个视图都使用完全相同的 URL,因为我不想让我的 URLConf 变得更复杂。我想要 GET 和 POST 的单独视图以使我的代码更清晰。代码是这样的:
def view2 (request):
# handle POST request, possibly a ajax one
return HTTPRESPONSE(json_data, mimetype="Application/JSON")
def view1 (request):
if method == POST:
view2(request)
# What should I return here???
else:
# handle GET
return render(request, template, context)
我的问题是关于# What should I return here???
行。如果我不在那里返回,则会发生错误:
不返回 http 响应
但我已经在 view2 中返回了一个 HTTP 响应。我怎样才能做到这一点?
【问题讨论】:
你应该return view2(request)
。 View2 将结果返回给调用者(view1
),但调用者也需要返回。
【参考方案1】:
另一种可能更简洁的方法是使用class-based views
from django.views.generic import TemplateView
class View1(TemplateView):
def get(self, request, *args, **kwargs):
"""handle get request here"""
def post(self, request, *args, **kwargs):
"""handle post request here"""
def head(self, request, *args, **kwargs):
"""handle head request here. Yes, you can handle any kind of requests, not just get and post"""
当然,您可以添加常用方法,__init__
(除非您确定自己在做什么,否则这是无用的),应用login_required
(请参阅this SO question)以及几乎所有您可以使用 django 视图执行的操作(例如应用中间件、权限等)和 python 类(例如继承、元类/装饰器等)
此外,Django 还提供了一大堆基于通用类的视图来解决常见情况,如列表页面、详细信息页面、编辑页面等。
【讨论】:
我真的很喜欢这个答案。它使代码非常清晰且易于维护。 这绝对是处理视图的更好方法。当您可以调用单独的函数时,您不想在if else
中编写两个大而复杂的逻辑。【参考方案2】:
需要返回view2的结果:
def view1 (request):
if request.method == 'POST':
return view2(request)
else:
# handle GET
return render(request, template, context)
【讨论】:
以上是关于如何为 GET 和 POST 编写单独的视图的主要内容,如果未能解决你的问题,请参考以下文章
如何为没有已知列的 PostgreSQL 视图编写通用更新触发器?