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

时间:2012-05-03 11:06:15

标签: python django django-views python-import

困境

我的views.py非常笨拙,所以我想把它分成我应用内的一个单独的views模块。但是,由于两个原因,我不确定这是一个好主意:

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

  2. 我不确定在Django社区中创建views模块是否被视为良好做法。

  3. 实施例

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

2 个答案:

答案 0 :(得分:9)

  

如果不使用django.db.get_model

,我无法导入模型

你可以:from project_name.app_name.models import MyModel并且最好的方式是,“非常不鼓励包装内进口的相对进口”, - said in PEP-8

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

您可以使用任何名称将视图保存在任何模块中的任何文件中。所以这里没有特殊规则,如果你认为将模块分成子模块会很好,那就去做吧。

答案 1 :(得分:3)

DrTyrsa指出,views没有特别的意义。因此,作为创建子包的替代方法,您可以创建与现有views.py - blog_views.pyposts_views.py等相同级别的多个文件。只要您在网址中使用正确的引用.py,这很好用。