Django:将views.py分离成自己的模块是个好主意吗?

7

困境

我的 views.py 变得非常难以管理,因此我想将其拆分为应用程序内部的单独的 views 模块。然而,我不确定这是否是一个好主意,原因如下:

  1. 如果我的视图文件与应用程序名称相同,我无法导入模型而不使用 django.db.get_model,因此我担心我的方法可能有缺陷。我听说最好避免在模块内发生名称冲突;我应该重命名我的视图文件吗?

  2. 我不确定在 Django 社区中创建一个 views 模块是否被认为是良好的实践。

示例

例如,对于名为 blogs 的应用程序,其中包含一个 Blog 模型和一个 Post 模型:

blogs/
    __init__.py
    models.py
    urls.py
    views/
        __init__.py
        blogs.py
        posts.py

这是我的 blogs.views.blogs

# project/blogs/views/blogs.py

from django.db.models import get_model
from django.shortcuts import get_object_or_404
from django.views.generic import ListView, DetailView

# Cannot import model directly, results in `ImportError: No module named models`.
# This can be resolved if I resolve the name collision between this file and
# the app itself.
#
# from blogs.models import Blog


class BlogListView(ListView):
    model = get_model('blogs', 'Blog')

    def get_queryset(self):
        return self.model.objects.all()


class BlogDetailView(DetailView):
    model = get_model('blogs', 'Blog')

    def get_object(self):
        blog_pk = self.kwargs.get('blog_pk')
        return get_object_or_404(self.model.objects, pk=blog_pk)

问题

我有两个问题:

  1. 首先,我是否应该分离我的视图?

  2. 如果是这样,使用 get_model 是一个好主意吗?还是有一种方法可以直接导入我的模型而不使用这种方法?或者我应该更改我的视图文件名,例如通过添加后缀 _views(例如:blogs.views.blogs_views.py)以避免整个问题?


可能是Django:将views.py拆分为多个文件的重复问题。 - Hardik Sondagar
2个回答

10
我无法在不使用django.db.get_model的情况下导入模型。
你可以使用如下方式:from project_name.app_name.models import MyModel,这是首选方式,“相对导入在包内部的导入中受到高度反对”,正如PEP-8所述。
名称方面不应该有任何问题,views.py在Django中没有特殊的含义,它只是一种惯例。
您可以将视图保留在任何文件中,以任何名称放置在任何模块下,因此在此没有特殊规则。如果您认为将模块分成子模块会更好,请这样做。

嗯...这对我不起作用。我正在使用Django 1.4,按照你建议的更改导入语句会导致相同的ImportError。但是,感谢关于相对导入的说明!从现在开始,我会确保我的项目中的导入遵循这个约定。 - Brian Gesiak
在Django 1.4中使用startproject时,项目是否不是模块,因此我无法从中导入? ImportError是“没有名为blogs.models的模块”,这使我认为project_name首先不是一个模块。 - Brian Gesiak
@modocache 你已经用你的实际项目名称替换了 project_name 吗? - DrTyrsa
当然可以!这是我正在开发的示例项目:https://github.com/modocache/django-bad-import - Brian Gesiak
请在 django-bad-import/ 中放置一个空的 __init__.py 文件。 - DrTyrsa
我实际上已经尝试在 django-bad-import/django-bad-import/example/ 中放置 __init__.py,但是到目前为止都没有成功。我决定简单地给视图文件添加后缀来解决这个问题。感谢您的帮助! - Brian Gesiak

4
正如DrTyrsa指出的那样,views没有特殊的含义。因此,作为创建子包的替代方案,您可以在现有的views.py文件同级目录下创建几个文件 - blog_views.pyposts_views.py等。只要在urls.py中使用正确的引用,这种方法就可以运行良好。

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