【问题标题】:Simple URL mapping issue简单的 URL 映射问题
【发布时间】:2016-03-01 04:43:44
【问题描述】:

我想映射我的 urls.py 以包含此 url:http://127.0.0.1:8000/activity/Arts%20&%20Crafts/member

这个网址是由我的activity.html模板中的这行代码创建的:

 <li><a href='/activity/{{ activity.name }}/member'>{{ activity.name }}</a></li>

Arts & Crafts 是我在模型 Activity 下创建的对象的名称:

(models.py)

class Activity(models.Model):
    name = models.CharField(max_length=50)
    comments = models.CharField(max_length=300, null=True, blank=True)
    questions = models.ManyToManyField(Question, blank=True)
    pub_date = models.DateTimeField('Date published')
    def __str__(self):
        return self.name

现在,我在 urls.py 中的 url 看起来像这样:

url(r'^activity/{{ models.Activity.name }}/member/$', views.SelectView.as_view(), name='select_member'),

但它不起作用。当我尝试去http://127.0.0.1:8000/activity/Arts%20&%20Crafts/member;我收到“未找到页面”错误消息,提示“当前 URL、活动/Arts & Crafts/member,与其中任何一个都不匹配。”

谁能告诉我我的网址有什么问题,以及如何解决?谢谢。

额外信息—— urls.py: 从 django.conf.urls 导入 url

从 .导入视图

urlpatterns = [  
    url(r'^$', views.IndexView.as_view(), name='index'),
    url(r'^detail/$', views.DetailView.as_view(), name='detail'),
    url(r'^activity/$', views.ActivityView.as_view(), name='activity'),
    url(r'^activity/{{ models.Activity.name }}/member/$', views.SelectView.as_view(), name='select_member'),
]

views.py:

class SelectView(generic.ListView):
  template_name = 'expcore/select_member.html'
  model = Activity

【问题讨论】:

  • 为什么不使用内置的 url 标签?喜欢{% url 'myapp:view-name' %}
  • @neo-xx 抱歉,我对 Django/Python 非常陌生,不确定您的意思:\您能澄清一下吗?
  • 假设您在该应用中有一个 django 应用 a 和一个视图 v,因此您可以使用 {% url 'a:v' %} 这将生成您尝试手动生成的 url
  • 另外请添加 urls.py 和 views.py
  • @neo-xx 添加,我现在只是使用简化视图。

标签: python django django-urls


【解决方案1】:

更新您的urls.py 以获取活动名称:

url(r'^activity/(?P<activityname>[^/]+)/member/$',
    views.SelectView.as_view(), name='select_member'),

正则表达式将捕获活动的名称并将其作为关键字 arg 传递给视图函数的适当方法(get 或 post)。在该函数中,您可以从kwargs['activityname'] 检索活动名称,然后通过Activity.objects.get(name=kwargs['activityname']) 检索具有关联名称的活动对象。

然后在您的模板中,您可以使用生成 url

<li><a href="{% url 'select_member' activity.name %}">{{ activity.name }}</a></li>

【讨论】:

  • 谢谢你的解释,真的很有帮助。
  • 这是否意味着我需要在我的 SelectView 视图中包含 slug_url_kwarg = 'activityname'slug_field = 'activityname'?我正在尝试将活动名称放到 select_member.html 上;为什么&lt;h1&gt;{{ activityname }}: Member Selection&lt;/h1&gt; 不起作用? :x
  • 您不需要在 SelectView 中包含 slug_url_kwargslug_fieldactivityname 在模板中不起作用,因为它尚未添加到模板上下文中。您可以继续使用已经在模板上下文中的activity.name
  • 我试过&lt;h1&gt;{{ activity.name }}: Member Selection&lt;/h1&gt;,但活动名称仍然没有出现:/
  • 啊,是的,您使用的是ListView,它将加载所有Activity 对象,而不仅仅是一个。您可以从自动添加到上下文的列表object_list 中遍历模板内的所有Activity。试试{% for activity in object_list %} &lt;h1&gt;{{ activity.name }}&lt;/h1&gt;{% endfor %}
【解决方案2】:

这不是定义 url 的正确方法。我建议阅读 Django 文档中的relevant section,了解如何为视图创建 url。

url(r'^activity/(?P<name>\W+)/member/$', views.SelectView.as_view(), name='select_member'),

除此之外,还有一个问题需要解决。由于您需要按名称获取对象,因此您需要在视图类中将 slug_url_kwargslug_field 更改为 name

class SelectView(generic.ListView):
    template_name = 'expcore/select_member.html'
    model = Activity
    slug_url_kwarg = 'name'
    slug_field = 'name'

确保在模板中创建 url 时始终使用 {% url %} 模板标签:

<li><a href="{% url 'select_member' activity.name %}">{{ activity.name }}</a></li>

【讨论】:

    【解决方案3】:

    我认为应该在模板中使用模型变量,但不能将模型变量放在 url() 中。你应该使用:

    url(r'/activity/(?P<activityid>[0-9a-zA-z\.\_]+)/member/$', views.SelectView.as_view),
    

    然后检查“activityid”以验证它是否对应于已知和现有的页面并最终将其可视化。

    【讨论】:

      【解决方案4】:

      Refer this link

      你的 urls.py

      url(r'^activity/{{ models.Activity.name }}/member/$', views.SelectView.as_view(), name='select_member'),
      

      改成

      url(r'^activity/(?P<activity_name>[^/]+)/member/$', views.SelectView.as_view(), name='select_member'),
      

      在模板中打印路径时使用

      <li><a href="{% url 'select_member' activity.name %}">{{ activity.name }}</a></li>
      

      【讨论】:

        猜你喜欢
        • 2021-06-28
        • 2011-08-20
        • 2011-01-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-02
        • 1970-01-01
        • 2012-09-14
        相关资源
        最近更新 更多