【发布时间】:2012-11-18 03:12:14
【问题描述】:
我有很多基于类的视图,它们使用 reverse(name, args) 来查找 url 并将其传递给模板。但是,问题是必须先实例化基于类的视图,然后才能定义 urlpatterns。这意味着在 urlpatterns 为空时实例化该类,从而导致反向抛出错误。我一直在通过将 lambda: reverse(name, args) 传递给我的模板来解决这个问题,但肯定有更好的解决方案。
作为一个简单的示例,以下失败并出现异常: xxxx 配置不当 包含的 urlconf mysite.urls 中没有任何模式
mysite.urls
from mysite.views import MyClassView
urlpatterns = patterns('',
url(r'^$' MyClassView.as_view(), name='home')
)
views.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...
编辑:
我就是这样用的:
views.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):
基本上我想对几种不同的内容类型使用相同的侧边栏模板。尽管侧边栏中显示的模型是任意的,但格式始终相同。
【问题讨论】:
标签: python django django-views reverse