python - Django 类 View 和反向 URL

标签 python django django-views reverse

我有很多基于类的 View ,它们使用 reverse(name, args) 来查找 url 并将其传递给模板。然而,问题是基于类的 View 必须在定义 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')
)

View .py

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

主页.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})

它确实有效,但这真的很难看,当然还有更好的方法。那么有没有一种方法可以在基于类的 View 中使用 reverse 但避免 urlpatterns 的循环依赖需要 view required reverse required urlpatterns...

编辑:

我是这样用的:

View .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):

基本上,我想对几种不同的内容类型使用相同的边栏模板。尽管侧边栏中显示的模型是任意的,但格式始终相同。

最佳答案

对于您的示例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_lazy .下面是一个 reverse_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 而不是 reverse,因为 url conf 尚未加载。

关于python - Django 类 View 和反向 URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13636064/

相关文章:

python - 使用 urlencode python 构建查询字符串

python - django表单提交者返回非 "post"页面

python - 值错误 : invalid literal for int() with base 10:

python - Django:类型错误:上下文必须是 dict 而不是 str

django - 禁止(403)CSRF验证失败。请求中止

python - 如何将多个参数从 pandas 数据帧传递给函数并将结果返回到数据帧中特定位置的数据帧

python - virtualenv 中的配置位置

python - Avast 将 SciPy 检测为病毒?

python - 如何初始化非模型表单上的数据?

django - Django Rest Framework 序列化程序中的聚合(和其他带注释的)字段