6

困境

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:)来完全避免这个问题?

4

2 回答 2

10

我无法在不使用 django.db.get_model 的情况下导入模型

您可以:from project_name.app_name.models import MyModel而且最好的方式是“非常不鼓励对包内导入的相对导入”,如PEP-8 中所述

名称应该没有任何问题,views.py在 Django 中没有特殊含义,它只是一个约定。

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

于 2012-05-03T11:18:28.447 回答
4

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

于 2012-05-03T11:34:30.407 回答