Я пытаюсь достичь: мое приложение новостей должно отображать slug, но только запрашивать статью по ID в виде /news/24/this-is-the slugОтображение как slug, так и ID по URL-адресу, но маршрут по ID только в Django
К сожалению, я получаю NoReverseMatch: Reverse for 'news_detail' with arguments '('',)' and keyword arguments '{}' not found.
при попытке просмотреть статью. URL-адрес, сгенерированный в шаблоне, выглядит правильно, как указано выше (я могу подтвердить это, выполнив поиск через Haystack, который доставляет правильный URL-адрес).
models.py
class News(models.Model):
id = models.IntegerField(primary_key=True, editable=False)
category = models.CharField(max_length=50L)
title = models.CharField(max_length=200L)
rss_summary = models.TextField(max_length=2000L)
body_text = models.TextField(max_length=5000L)
post_date = models.DateTimeField()
prettyurl = models.SlugField(max_length=100L)
class Meta:
db_table = 'news'
def __unicode__(self):
return self.title
def get_absolute_url(self):
return urlresolvers.reverse('news_detail', kwargs={'pk': self.id, 'slug': self.prettyurl })
urls.py
urlpatterns = patterns(
'',
url(
r'^$',
view=views.NewsListView.as_view(),
name='news_index'),
url(
r'^(?P<pk>\d+)/',
view=views.NewsDetailView.as_view(),
name='news_detail'),
url(
r'^(?P<pk>\d+)/(?P<slug>[-\w]+)/$',
view=views.NewsDetailView.as_view(),
name='news_detail'),
url(
r'^archive/$',
view=views.NewsArchiveIndexView.as_view(),
name="archive_month"),
[... more unrelated urls ...]
views.py
class NewsDetailView(DetailView):
#name='news_detail'),
model = News
context_object_name = 'news'
#slug_url_kwarg = 'prettyurl'
#slug_field = 'prettyurl'
template_name = 'news/detail.html'
Шаблон
`<p><a href="{% url 'news_detail' news.slug %}">Permalink</a> for this article.`
Если вам не нужен пул, а только идентификатор, тогда нет причин передавать его в качестве аргумента для представления, верно? – yuvi