6

ジレンマ

私はかなり扱いにくいので、アプリ内の別のモジュールにviews.py分離したいと考えています。viewsただし、次の 2 つの理由から、これが良いアイデアかどうかはわかりません。

  1. ビュー ファイルがアプリ名と同じ名前の場合、 を使用しないとモデルをインポートできないdjango.db.get_modelため、私のアプローチに問題があるのではないかと心配しています。モジュール内で名前の衝突を避けるのがベストプラクティスだと聞いたことがあります。ビュー ファイルの名前を変更する必要がありますか?

  2. viewsモジュールを作成することが一般的に Django コミュニティ内で良い習慣と見なされているかどうかはわかりません。

たとえば、モデルとモデルをblogs持つという名前のアプリの場合:BlogPost

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)

質問

私の質問は 2 つあります。

  1. そもそも自分の見解を分離する必要がありますか?

  2. もしそうならget_model、良いアイデアを使用していますか、またはこの方法を使用せずにモデルを直接インポートする方法はありますか? または、問題を完全に回避するために、たとえば接尾辞_views(例: )を追加して、ビュー ファイル名を変更する必要がありますか?blogs.views.blogs_views.py

4

2 に答える 2

10

django.db.get_modelを使用せずにモデルをインポートすることはできません

次のことができます。PEP-8で述べたfrom project_name.app_name.models import MyModelように、「パッケージ内インポートの相対インポートは強くお勧めしません」というのが望ましい方法です。

名前に問題はないはず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 に答える