困境

我的views.py非常笨拙,因此我想将其分离到应用程序内部的单独的views模块中。但是,由于两个原因,我不确定这是一个好主意:

  • 如果我的 View 文件与应用程序名称相同,那么我不能在不使用django.db.get_model的情况下导入模型,因此我担心我的方法可能有缺陷。我听说最好的方法是避免模块内的名称冲突。我应该重命名 View 文件吗?
  • 我不确定在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)
    

    问题

    我的问题是双重的:
  • 首先我应该分开我的观点吗?
  • 如果是这样,使用get_model是个好主意,还是有一种方法可以直接导入我的模型而无需使用此方法?还是应该更改 View 文件名,例如通过添加后缀_views(例如:blogs.views.blogs_views.py)来完全避免此问题?
  • 最佳答案



    您可以:from project_name.app_name.models import MyModel并且它是一种更可取的方式,“不鼓励相对于包内导入的相对导入”,即said in PEP-8

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

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

    关于python - Django:将views.py分成自己的模块是个好主意吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10430095/

    10-12 18:27