【问题标题】:Django Class Views and Reverse UrlsDjango 类视图和反向 URL
【发布时间】: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


    【解决方案1】:

    对于您的示例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而不是rev​​erse,因为url conf还没有加载。

    【讨论】:

      【解决方案2】:

      您的home 网址可以通过声明{% url 'home' %} 直接在您的模板中访问。这是在 urls.py 文件中访问命名 url 的标准方法。

      您不必在基于类的视图函数中将home_url 变量显式发送到您的模板。

      换句话说,在您的home.html 文件中:-

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

      会的。

      【讨论】:

      • 以上只是一个简单的例子来演示用法。我会用一个更好的例子来更新我的帖子,以说明为什么我不能使用它。
      猜你喜欢
      • 2012-01-25
      • 2012-01-25
      • 2012-12-05
      • 2012-12-28
      • 2015-01-07
      • 2015-03-29
      • 2016-12-27
      • 2014-11-14
      • 2017-11-03
      相关资源
      最近更新 更多