1

私は1.3から1.1に移行したばかりのアプリケーションを移行し始めています。django 1.3 URLテンプレートタグとクラスベースのビュー

私はクラスベースのビューの厚さで取得し始めていると吹き飛ばされていますが、実際には良い方法ではありません。
私はいくつかの不満を持っているが、ここで具体的な質問です:

は、これは私がジェネリッククラスベースのビューでURLテンプレートタグを使用することができる唯一の方法ですか?
Django reverse url with parameters to a class based view
つまり、すべての単一のURLエントリに名前を付ける必要がありますか?ジャンゴの基本理念の一つはDRY、まだここで私たちはあるよう

これは、事前に

おかげで..... RY-INGの....私にはばかげているようです。

編集:{」の引数を持つ 'views.HomeView.as_view' のリバース '()' とキーワード引数:
だから私はhttps://gist.github.com/1877374

を持っており、レンダリング中にエラー TemplateSyntaxError キャッチNoReverseMatchを取得}' 見つかりません。

これは間違っていますか?


タンジェント:
私たちはにurls.pyファイル

内のすべての単一のエントリに名前を持っている場合、私たちはRY-INGのしていると考えている理由についてもう少し説明したいと思います私はデカップリングについて完全に理解して https://gist.github.com/1877462

よう

私urls.pyは、一般的に見えます。
要点は、の場合にはとなるようにしています。私は絶対に必要なときに、名前の機能を使用します。さもなければ、なぜ私は時間とエネルギーを冗長にすべてのエントリに追加し、すべてのエントリに名前をつけたいのですか?それは頻繁にviews.pyのクラス/ファンクションの名前と同じでしょうか?

多分これは別の問題に分かれているはずです。

答えて

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に名前を付けるのと同じくらい繰り返されるので、私はあなたがそれを好きになるとは思わない!

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

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

url()は基本的にそれが簡単という名前のURLパターンを追加することができ単なる関数であること。本当にあなたのURLに名前をつけたくないのなら、名前を自動的に生成する独自の関数を書くことができます。

+0

このAlasdairに返信してくれてありがとう。私が{%url MyView.as_view%}をやろうとすると、これはうまくいかないでしょうか?なぜ私の見解では変数として割り当てる必要がありますか?ビュークラスは、呼び出し可能にする必要があるas_view()関数を継承すると思ったのですか? –

+0

'MyView.as_view'は呼び出し可能なビューではありません。これは、呼び出し可能なビューを返すメソッドです。 'MyView.as_view()'を変数に代入しなければ、それは無名関数なので、元に戻すことはできません。 – Alasdair

+0

pre-django1.3関数ベースのビューで作業していたとき、なぜ関数ビューが(私たちがURLパターンで渡した)匿名関数として扱われなかったのですか?私は基本的に私たちは私たちではなかったurl関数のメソッドを供給していたという意味ですか?彼らはちょうど私たちが意見として定義したものでした。私は、クラスベースのMyView.as_view()と関数ベースのmy_view()を呼び出すことの違いを見ていません –

2

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

第2に、URLパターンの名前付けは不要ですが、ですが、多くの点でが推奨されています。また、テンプレートを変更せずにビューのメソッド名を変更する柔軟性も提供します。あなたは一連のURL名を決めてデザイナーに渡してテンプレートを扱うことができますし、自由にビューメソッド(またはクラス)の名前を自由に付け加えることができます。

第三に、あなたは、ビューに方法フルパスを渡す必要がある - それは、クラスベースのビューのas_viewことが、あなたは正しい数の引数と型を渡すことを確認する必要があります。位置とキーワードの引数を混在させないでください。

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

+0

2番目のポイントは、[Djangoの設計思想(疎結合)の1つ]として特に重要です(https://docs.djangoproject.com/en/dev/misc/design-philosophies/) –

+0

@burhan特定の答え。私はいくつかのコードを含むように質問を編集しました。これは、あなたがURLテンプレートタグで "as_view"を使用することによって意味されたものですか?私はここで何か愚かなものを紛失していると確信していますが、何がわかりません。 –

+0

あなたはそれにもインポート可能なパスを与える必要があります(つまり、アプリケーション名を与えることを意味します)。 あなたの['urls.py'](https://gist.github.com/1877462)の例では、何回か '___view'と入力していることを除いて、コードの繰り返しはありません。両方のバージョンの名前の数が正確に4つのURLパターンを持っています。 –

1

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

関連する問題