【问题标题】:Category slug in article URL (ManyToManyField)文章 URL 中的类别 slug (ManyToManyField)
【发布时间】:2015-04-04 13:10:23
【问题描述】:

我正在尝试构建一个 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>

谁能帮我解决这个问题?

【问题讨论】:

  • 我注意到的几个问题——(这可能是也可能不是问题的根本原因)——在view_workslugcategory 参数位置互换。这意味着,类别被用来代替 slug,反之亦然。此外,将 slice 与 get_absolute_url 一起使用不是一般做法 - 你究竟想在这里做什么?
  • 我认为参数位置不是问题。我正在从 url 切片 /en-us

标签: django url categories slug manytomanyfield


【解决方案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 })

【讨论】:

  • 好的,非常感谢!你是我的救星
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-22
  • 2016-03-06
  • 2018-11-15
  • 1970-01-01
  • 1970-01-01
  • 2017-01-12
  • 2019-04-19
相关资源
最近更新 更多