2015-02-04 2 views
1

Я пытаюсь построить шаблон URL, такие как/категории/статьи/Категория пробкового в статье URL (ManyToManyField)

но проблема в том, одна статья может быть связан со многими категориями, поэтому URL должен быть что-то как/категория + категория/статьи/

Что у меня есть:

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> 

Может ли кто-нибудь помочь мне в этом?

+0

Пара вопросов, которые я заметил - (который может или не может быть основной причиной выпуска) - в 'view_work',' slug' и 'category' заменены. Это означает, что категория используется вместо пули, и наоборот. Кроме того, не рекомендуется использовать срез с 'get_absolute_url' - что именно вы пытаетесь сделать здесь? – karthikr

+0

Я не думаю, что позиции параметров - проблема. И я нарезаю/en-us от url – Kirill

ответ

1

Я думаю, это потому, что Work.category является полем ManyToMany. Итак, в вашей функции Work.get_absolute_url вы пытаетесь получить self.category, который на самом деле возвращает django.db.models.fields.related.ManyRelatedManager (что в итоге вернет список Category).

Вы могли бы это исправить, изменив absolute_url_function на что-то вроде:

def get_absolute_url(self): 
    category = self.category.all()[0] 
    return return reverse('view_work', kwargs={'slug': self.slug, 'category': category }) 
+0

Да, большое спасибо! Вы мой спаситель <3 BTW, в случае, если работа имеет две или более категории, в url будет первый. Все в порядке, но мне любопытно, есть ли другое решение? – Kirill

Смежные вопросы