文章 URL 中的类别别名 (ManyToManyField)
Category slug in article URL (ManyToManyField)
我正在尝试构建一个 URL 模式,例如 /category/article/
但问题是,一篇文章可能与多个类别相关,所以 URL 应该类似于 /category+category/article/
我有:
models.py
from django.db import models
from django.core.urlresolvers import reverse
class Category(models.Model):
name = models.CharField(max_length=128, unique=True)
slug = models.SlugField(unique=True)
def __unicode__(self):
return self.name
def get_absolute_url(self):
return reverse('view_category', kwargs={ 'slug': self.slug })
class Meta:
verbose_name_plural = "Categories"
class Work(models.Model):
category = models.ManyToManyField(Category)
title = models.CharField(max_length=128)
slug = models.SlugField(unique=True)
def __unicode__(self):
return self.title
def get_absolute_url(self):
return reverse('view_work', kwargs={'slug': self.slug, 'category': self.category })
views.py
from django.shortcuts import render_to_response, get_object_or_404
from app.models import Work, Category
def index(request):
return render_to_response('app/index.html', {
'works': Work.objects.all()[:5]
})
def all_works(request):
return render_to_response('app/all_works.html', {
'categories': Category.objects.all(),
'works': Work.objects.all()[:5]
})
def view_category(request, slug):
category = get_object_or_404(Category, slug=slug)
return render_to_response('app/categories.html', {
'categories': Category.objects.all(),
'category': category,
'works': Work.objects.filter(category=category)[:5]
})
def view_work(request, slug, category):
return render_to_response('app/work.html', {
'work': get_object_or_404(Work, slug=slug, category=category)
})
urls.py
from django.conf.urls import patterns, url
from app import views
urlpatterns = patterns('',
url(r'^works/$', views.all_works, name='view_all_works'),
url(r'^works/(?P<slug>[-\w]+)/$', views.view_category, name='view_category'),
url(r'^work/(?P<category>[-\w]+)/(?P<slug>[-\w]+)/$', views.view_work, name='view_work'),
url(r'^$', views.index, name='index'),
)
在模板中:
<a href="{{ work.get_absolute_url|slice:'6:' }}">{{ work.title }}</a>
目前我得到一个错误:
KeyError at /
u'category'
Request Method: GET
Request URL: http://127.0.0.1:8000/
Django Version: 1.7.2
Exception Type: KeyError
Exception Value:
u'category'
Exception Location: E:\web\env\lib\site-packages\django\core\urlresolvers.py in _reverse_with_prefix, line 448
11 <li>
12 <a href="{{ work.get_absolute_url|slice:'6:' }}" >{{ work.title }}</a>
13 </li>
谁能帮我解决这个问题?
我认为这是因为 Work.category
是一个 ManyToMany
字段。所以在你的 Work.get_absolute_url
函数中你试图得到 self.category
这实际上是 returning django.db.models.fields.related.ManyRelatedManager
(结果将 return 列表 Category
's).
您可能可以通过将 absolute_url_function 更改为类似以下内容来解决此问题:
def get_absolute_url(self):
category = self.category.all()[0]
return return reverse('view_work', kwargs={'slug': self.slug, 'category': category })
我正在尝试构建一个 URL 模式,例如 /category/article/
但问题是,一篇文章可能与多个类别相关,所以 URL 应该类似于 /category+category/article/
我有:
models.py
from django.db import models
from django.core.urlresolvers import reverse
class Category(models.Model):
name = models.CharField(max_length=128, unique=True)
slug = models.SlugField(unique=True)
def __unicode__(self):
return self.name
def get_absolute_url(self):
return reverse('view_category', kwargs={ 'slug': self.slug })
class Meta:
verbose_name_plural = "Categories"
class Work(models.Model):
category = models.ManyToManyField(Category)
title = models.CharField(max_length=128)
slug = models.SlugField(unique=True)
def __unicode__(self):
return self.title
def get_absolute_url(self):
return reverse('view_work', kwargs={'slug': self.slug, 'category': self.category })
views.py
from django.shortcuts import render_to_response, get_object_or_404
from app.models import Work, Category
def index(request):
return render_to_response('app/index.html', {
'works': Work.objects.all()[:5]
})
def all_works(request):
return render_to_response('app/all_works.html', {
'categories': Category.objects.all(),
'works': Work.objects.all()[:5]
})
def view_category(request, slug):
category = get_object_or_404(Category, slug=slug)
return render_to_response('app/categories.html', {
'categories': Category.objects.all(),
'category': category,
'works': Work.objects.filter(category=category)[:5]
})
def view_work(request, slug, category):
return render_to_response('app/work.html', {
'work': get_object_or_404(Work, slug=slug, category=category)
})
urls.py
from django.conf.urls import patterns, url
from app import views
urlpatterns = patterns('',
url(r'^works/$', views.all_works, name='view_all_works'),
url(r'^works/(?P<slug>[-\w]+)/$', views.view_category, name='view_category'),
url(r'^work/(?P<category>[-\w]+)/(?P<slug>[-\w]+)/$', views.view_work, name='view_work'),
url(r'^$', views.index, name='index'),
)
在模板中:
<a href="{{ work.get_absolute_url|slice:'6:' }}">{{ work.title }}</a>
目前我得到一个错误:
KeyError at /
u'category'
Request Method: GET
Request URL: http://127.0.0.1:8000/
Django Version: 1.7.2
Exception Type: KeyError
Exception Value:
u'category'
Exception Location: E:\web\env\lib\site-packages\django\core\urlresolvers.py in _reverse_with_prefix, line 448
11 <li>
12 <a href="{{ work.get_absolute_url|slice:'6:' }}" >{{ work.title }}</a>
13 </li>
谁能帮我解决这个问题?
我认为这是因为 Work.category
是一个 ManyToMany
字段。所以在你的 Work.get_absolute_url
函数中你试图得到 self.category
这实际上是 returning django.db.models.fields.related.ManyRelatedManager
(结果将 return 列表 Category
's).
您可能可以通过将 absolute_url_function 更改为类似以下内容来解决此问题:
def get_absolute_url(self):
category = self.category.all()[0]
return return reverse('view_work', kwargs={'slug': self.slug, 'category': category })