我想将我的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
答案 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_kwarg
和slug_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)
你的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>