处理包含连字符的Django URL的问题

3 投票
2 回答
3040 浏览
提问于 2025-04-16 20:08

我在Django的url配置文件里有一组简单的链接,这些链接指向一些对象的详细信息页面。

urlpatterns = patterns('',  
url(r'^projects/(?P<slug>[\w-]+)/$', ProjectDetailView.as_view(), name='view_project'),
url(r'^roles/(?P<slug>[\w-]+)/$', RoleDetailView.as_view(), name='view_role'),
)

问题是,每当链接里有连字符(比如:/projects/new-project/)的时候,Django的开发服务器就会卡住。我用调试工具检查过,发现解析链接和根据slug从数据库获取对象没有问题。但是在渲染模板的时候,它就卡住了。我搞不清楚问题出在哪里。有没有人知道可能是什么原因?

视图代码是,

class ProjectDetailView(DetailView):
  model=Project
  context_object_name='project_obj'
  slug_field='slug'

  @method_decorator(login_required)
  def dispatch(self, *args, **kwargs):
    return super(ProjectDetailView, self).dispatch(*args, **kwargs)

模板代码是,

 {% extends "base.html" %}
    {% load static %}
    {% block static %}
    <link rel="stylesheet" type="text/css" href="{% get_static_prefix %}css/demo_table.css">
    <script type="application/javascript" src="{% get_static_prefix %}js/users-index.js"></script>
    {% endblock %}

        {% block content %}
        <div id="itemlist">    

          {% if project_obj %}
          <div>
            <p>{{ project_obj.title }}</p>
            <p>{{ project_obj.description }}</p>
          </div>
          {% else %}
          <p>No Details available.</p>
          {% endif %}
        <div>
        {% endblock %}

在我从模板中移除了一些标签后,它就开始正常工作了,

<div id="itemlist">    

      {% if project_obj %}
      <div>
        <p>{{ project_obj.title }}</p>
        <p>{{ project_obj.description }}</p>
      </div>
      {% else %}
      <p>No Details available.</p>
      {% endif %}
    <div>

2 个回答

5

[\w-]+ 改成 [-\w]+。对我来说,[\w-]+ 在 Python 的正则表达式里总是不好使。

1

我猜你可能写了一个自定义的模板标签,但它出问题了。你在 base.html 里用了它 :P

撰写回答