如何在 Django 的视图中清理多个嵌套的 if 语句

Posted

技术标签:

【中文标题】如何在 Django 的视图中清理多个嵌套的 if 语句【英文标题】:How to clean up multiple nested if statements inside views in Django 【发布时间】:2016-02-08 15:22:20 【问题描述】:

我正在处理一个 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")

【问题讨论】:

【参考方案1】:

当 Django 1.4 发布时(我认为是 1.4),他们吹嘘了一个名为 Class-based Views 的新功能。您现在使用的是基于函数的视图,它们已经过时,甚至没有专门针对它们的 Django 文档部分。

文档很棒,但总而言之,基于类的视图是一种使用类在不同部分中组织视图(现在位于函数中)内代码的一种方式。

与基于函数的视图相比,这带来了两个好处。

    通过将每个功能分离到不同的类中来简化代码。在其最基本的形式中,具有 get 方法和 post 方法而不是 if-else 结构。 通过将不同类中的基本功能集中在一起来重用代码。

例如,如果有一个类在调用get 时自动呈现并返回一个表单并自动验证表单并创建对象或其他任何东西并在一切正常时重定向到成功页面,那该有多棒?

嗯,Django 附带了这些抽象,在本例中为 FormView。更好的是,FormView 在 Form 有效时执行称为 form_valid 的方法,在无效时执行称为 form_invalid 的方法,为您提供了一种理想的方式来做您想做的事。基本上,您必须编写的唯一代码就是您的 some_api_call 调用和 JsonResponses!

(我给出的重定向到成功 URL 的示例是 FormView 的默认用法,您只需在其中定义 success_url。这是文档中的第二个示例)。

PS:如果您使用 JSON,我强烈建议您使用 Django Rest Framework,它基本上是 API 调用的基于类的视图。简直太美了。

【讨论】:

酷,我会调查一下。 我尽量解释一下。但我最近发现我在解释方面很糟糕,但我希望它会有所帮助。

以上是关于如何在 Django 的视图中清理多个嵌套的 if 语句的主要内容,如果未能解决你的问题,请参考以下文章

清理多个不可关闭资源时减少嵌套

如何告诉 SwiftUI 视图绑定到多个嵌套的 ObservableObject

django rest框架中多个视图的相同验证

如何使我的多个 if 语句起作用?或者最好如何在我的代码中使用嵌套循环

如何在 django 的一个视图中使用多个表单

如何在 Django Rest Framework 中过滤嵌套的序列化程序?