我正在开发一个Django项目,其中一个视图看起来像多个if else语句。有没有办法清理代码?我对Django比较新,我的一个朋友建议使用装饰器。谁能指点我如何在这里使用装饰器?或清理此代码?任何链接或学习材料都会很棒。
if req.method == 'GET':
....# do stuff
elif req.method == 'POST':
....form = Form(req.POST)
....if form.is_valid():
........response = some_api_call(form.cleaned_data)
........if can_foobar(response):
............return JsonResponse({"status": "success"})
........else:
............return JsonResponse({"status": "failure", "reason": "couldn't foobar"})
....else:
........return JsonResponse({"status": "failure", "reason": "form invalid"})
答案 0 :(得分:3)
当Django 1.4问世(我认为它是1.4)时,他们吹嘘了一个名为Class-based Views的新功能。你现在使用的是基于函数的视图,它们已经过时了,甚至没有专门用于它们的Django文档的一部分。
文档很棒,但总结一下基于类的视图是一种通过使用类在不同的部分组织视图内部的代码(现在在函数中)的方法。
这比基于功能的视图带来了两个好处。
get
方法和post
方法,而不是if-else结构。例如,如果有一个类在调用get
时自动呈现并返回一个Form并自动验证Form并创建对象或其他什么,并在一切顺利时重定向到成功页面,那将是多么棒的OK?
嗯,Django附带了这种抽象,在这种情况下FormView。更好的是,当Form有效时,FormView会执行一个名为form_valid
的方法,而当它不是form_invalid
时,会执行一个方法,为您提供理想的方法来执行您想要的操作。基本上,您必须编写的唯一代码是some_api_call
调用和JsonResponses!
(我给重定向到成功URL的示例是FormView的默认用法,您只需在其中定义success_url
。这是文档中的第二个示例。)
PS:如果您正在使用JSON我强烈建议使用Django Rest Framework,这基本上是基于类的API调用视图。它真漂亮。