【问题标题】:Django: Is separating views.py into its own module a good idea?Django:将views.py 分离到自己的模块中是个好主意吗?
【发布时间】:2012-05-12 21:24:52
【问题描述】:

困境

我的views.py 变得非常笨拙,所以我想在我的应用程序中将它分离到一个单独的views 模块中。但是,我不确定这是一个好主意,原因有两个:

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

  2. 我不确定创建 views 模块在 Django 社区中是否被普遍认为是一种好的做法。

示例

例如,对于名为 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)来完全避免这个问题?

【问题讨论】:

标签: python django django-views python-import


【解决方案1】:

不使用 django.db.get_model 就无法导入模型

您可以:from project_name.app_name.models import MyModel 更可取的方式是“非常不鼓励使用包内导入的相对导入”,例如 said in PEP-8

名字应该没有问题,views.py在Django中没有特殊含义,只是约定而已。

您可以在任何模块的任何文件中以任何您想要的名称保存视图。所以这里没有什么特别的规定,如果你觉得把模块分成子模块就好了。

【讨论】:

  • 嗯...这对我不起作用。我正在使用 Django 1.4,并且像您建议的那样更改导入语句会导致相同的 ImportError。但是,感谢有关相对进口的说明!从现在开始,我将确保我的项目中的导入遵循该约定。
  • 在 Django 1.4 中使用 startproject 时项目不是模块,所以我无法从中导入? ImportError 是No module named blogs.models,这让我觉得project_name 一开始就不是模块。
  • @modocache 您是否将project_name 替换为您的实际项目名称?
  • 当然!这是我正在处理的示例项目:github.com/modocache/django-bad-import
  • @modocache 在django-bad-import/ 中放置空的__init__.py
【解决方案2】:

正如 DrTyrsa 指出的那样,views 没有特殊含义。因此,作为创建子包的替代方案,您可以只创建与现有 views.py 相同级别的多个文件 - blog_views.pyposts_views.py 等。只要您在 urls.py 中使用正确的引用,这工作正常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-28
    • 2013-10-20
    • 1970-01-01
    • 1970-01-01
    • 2019-08-07
    • 1970-01-01
    • 2013-03-02
    • 1970-01-01
    相关资源
    最近更新 更多