1

持っているアプリを 1.1 から 1.3 に移行し始めたところです。

私はクラスベースのビューの厚さに入り始めており、吹き飛ばされていますが、あまり良い方法ではありません.
いくつかの不満がありますが、ここでの具体的な質問は次のとおりです。

これは、一般的なクラスベースのビューで url テンプレート タグを使用できる唯一の方法ですか?
クラスベースのビューへのパラメータを持つDjango逆URL、
つまりすべてのURLエントリに名前を付ける必要がありますか?

Django の基本的な哲学の 1 つは DRY ですが、ここにいるのはばかげているように思えます.... RY-ing.....

前もって感謝します。

編集:
だから私はhttps://gist.github.com/1877374を持っています

レンダリング中に TemplateSyntaxError Caught NoReverseMatch: Reverse for 'views.HomeView.as_view' with Arguments '()' and keyword arguments '{}' not found というエラーが発生します。

これを間違って使用していますか?


Tangent: urls.py ファイル内のすべてのエントリ
に 名前を付ける必要がある場合、なぜ RY を使用していると私が考えるのかについて、もう少し説明したいと思います。

私の urls.py は通常 https://gist.github.com/1877462のようになります

デカップリングについては完全に理解しています。
ここでのポイントは、必要なときにそうする能力があるということです。必要なときは、名前機能を絶対に使用します。それ以外の場合、view.py のクラス/機能の名前と同じになることが多いのに、すべてのエントリに冗長に URL を追加し、すべてのエントリに名前を付けるために時間とエネルギーを費やしたいのはなぜですか?

たぶん、これはSOに関する別の質問に分岐する必要があります。

4

3 に答える 3

2

まず、これは繰り返されていません。URLに2回名前を付けていますか?それはあなた自身を繰り返すでしょう。

次に、URLパターンの命名は必須ではありませんが、多くの利点があります。そのため、これをお勧めします。また、テンプレートを変更せずに、ビューメソッド名を柔軟に変更できます。一連のURL名を決定し、それらをデザイナーに渡してテンプレートで作業することができます。また、ビューメソッド(またはクラス)に好きな名前を付けることができます。

第3に、viewメソッドにフルパスを渡す必要があります。したがって、クラスベースのビュー用である必要があり、正しい数とタイプの引数を渡すようにしてください。位置引数とキーワード引数を混在させないでください。as_view

または、URLパターンに名前を付けることで、上記のほとんどを回避できます。

于 2012-02-21T06:49:54.840 に答える
2

名前を付けずにクラスベースのビューを元に戻すことができない理由について、かなり手を振っている説明を次に示します。私は Django の内部構造にあまり詳しくないので、訂正されてうれしいです。

関数ベースのビューでは、

# my_app.views.py
def my_view(request):
    return HttpResponse("Hello, world!")

my_app.views.my_view呼び出し可能なビュー関数のパスであるため、逆にすることができます。

クラスベースのビューでは、

# my_app.views.py
class MyView(TemplateView):
    template_name = "hello_world.html"

my_app.views.MyView呼び出し可能なビュー オブジェクトではないため、逆にすることはできません。呼び出し可能なビューはMyView.as_view(). MyView.as_view()次のようにビューで変数に割り当てた場合:

# my_app.views.py
class MyView(TemplateView):
    template_name = "hello_world.html"
my_view = MyView.as_view()

# urls.py
url('^$', `my_view`),

そうすれば、名前を付けずに元に戻すことができますmy_view。このオプションは、URL に名前を付けるのと同じくらい繰り返されるので、気に入らないと思います!.

ただし、URL パターンに直接入れるMyView.as_view()と、匿名関数になります。どの変数にも割り当てられていないため、元に戻すために使用できるパスはありません。同様に、以下を元に戻すことはできません。

url('^$', lambda request: HttpResponse("Hello, World!")), 

これurl()は基本的に、名前付き URL パターンの追加を容易にする関数にすぎないことに注意してください。URL に名前を付けたくない場合は、自動的に名前を生成する独自の関数を作成できます。

于 2012-03-05T23:25:25.970 に答える
1

これがDRYの原則にどのように違反しているかはわかりません。これらはすべて異なることを行う個別のビューであり、逆にしたときに衝突しないように、それぞれに一意の識別子が与えられています。どちらかといえば、名前付きURLを使用すると、テンプレートレベルで記述しなければならないコードが減り、URLスキームがはるかに読みやすくなります。

于 2012-02-21T06:51:08.020 に答える