简单的URL映射问题

时间:2015-11-27 02:50:53

标签: python django django-urls

我想将我的urls.py映射到包含此网址: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&amp; 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(r'^activity/{{ models.Activity.name }}/member/$', views.SelectView.as_view(), name='select_member'),

但它不起作用。当我试着去http://127.0.0.1:8000/activity/Arts%20&%20Crafts/member;我收到一个“找不到页面”错误,说“当前网址,活动/艺术品和手工艺品/会员,与其中任何一个都不匹配。”

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

额外信息 - 的 urls.py: 来自django.conf.urls import 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

4 个答案:

答案 0 :(得分:1)

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

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

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

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

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

答案 1 :(得分:1)

这不是定义网址的正确方法。我建议阅读Django文档中有关如何为视图创建URL的relevant section

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 %}模板标记:

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

答案 2 :(得分:0)

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

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

然后检查&#34; activityid&#34;验证它是否与已知和现有页面相对应,并最终将其可视化。

答案 3 :(得分:0)

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>