1

私は、reverse(name, args) を使用して URL を検索し、これをテンプレートに渡すクラス ベースのビューを多数持っています。ただし、問題は、urlpatterns を定義する前に、クラス ベースのビューをインスタンス化する必要があることです。これは、urlpatterns が空のときにクラスがインスタンス化され、逆スロー エラーが発生することを意味します。テンプレートに lambda: reverse(name, args) を渡すことでこれを回避してきましたが、確かにより良い解決策があります。

簡単な例として、以下は例外で失敗します: ImproperlyConfigured at xxxx The included urlconf mysite.urls does not have any pattern in it

mysite.urls

from mysite.views import MyClassView

urlpatterns = patterns('',
    url(r'^$' MyClassView.as_view(), name='home')
)

ビュー.py

class MyClassView(View):
    def get(self, request):
        home_url = reverse('home')
        return render(request, 'home.html', {'home_url':home_url})

home.html

<p><a href={{ home_url }}>Home</a></p>

現在、views.py を次のように変更して、テンプレート レンダリングでリバースを強制的に実行することで、問題を回避しています。

class MyClassView(View):
    def get(self, request):
        home_url = lambda: reverse('home')
        return render(request, 'home.html', {'home_url':home_url})

それは機能しますが、これは本当に醜く、確かにもっと良い方法があります。クラスベースのビューでリバースを使用する方法はありますが、リバースを必要とするビューを必要とする urlpatterns の循環的な依存関係を回避するには、urlpatterns を必要とします...

編集:

私はこれを次のように使用しています:

ビュー.py

def sidebar_activeusers(cls):
    sidebar_dict = {'items' = []}
    qs = models.random.filter.on.users
    for user in qs:
        item = {
            'value': user.name,
            'href': reverse('user_profile', args=[hash_id(user.id)])}
    sidebar = loader.get_template('sidebar.html')
    cls.base_dict['sidebar_html'] = sidebar.render(Context(sidebar_dict))
    return cls

@sidebar_activeusers
class MyView1(View):
    base_dict = {}
    ...

@other_sidebar_that_uses_same_sidebar_template
class MyView2(View):

基本的に、いくつかの異なるコンテンツ タイプに同じサイドバー テンプレートを使用したいと考えています。サイドバーに表示されるモデルは任意ですが、形式は常に同じです。

4

2 に答える 2

2

宣言homeを使用して、テンプレートで URL に直接アクセスできます{% url 'home' %}。これは、urls.py ファイル内の名前付き URL にアクセスする標準的な方法です。

home_urlクラスベースのビュー関数で変数をテンプレートに明示的に送信する必要はありません。

言い換えれば、あなたのhome.htmlファイルで: -

<p><a href="{% url 'home' %}">Home</a></p>

しましょう。

于 2012-11-29T23:02:21.500 に答える
2

あなたの例MyClassViewでは、使用しても大丈夫ですreverse

class MyClassView(View):
    def get(self, request):
        home_url = reverse_lazy('home')
        return render(request, 'home.html', {'home_url': home_url}, 

reverseクラスが定義されているときはメソッドは呼び出されません -- リクエストが処理され、メソッドが呼び出されたときにのみ呼び出されるためget、エラーは発生しません。上記の例をテストしましたが、正常に動作します。

ただし、sidebar_activeusersデコレータを使用するreverseと、url conf がロードされる前に呼び出しが発生します。このような場合は、 を使用できますreverse_lazyreverse_lazy動作中の例を次に示します。

from django.core.urlresolvers import reverse_lazy

class MyOtherClassView(View):
    home_url = reverse_lazy('home')

    def get(self, request):
        return render(request, 'home.html', {'home_url':self.home_url})

今回home_urlは、クラスが定義されたときに設定されるreverse_lazyため、URL conf がまだロードされていないため、reverse の代わりに必要です。

于 2012-11-29T23:02:36.820 に答える