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