0

我想知道这种方法必须是可行的,因为我试图实现但我做不到。实际上我已经尝试通过

python manage.py shell
c=Category.objects.get(pk = 3)
c.get_absolute_url
#I got <bound method Category.get_absolute_url of <Category: Category2>>
c.get_absolute_url()
#It Doesn't work

我想在另一个名为 Article 的模型中实现它,它是 Category 模型的外键

我的意图是在文章中有一个方法,比如

def get_abs_url(self):
   c=Category.objects.get(pk=self.category)
   return c.get_absolute_url() + '/' + self.slug

类似的东西

4

2 回答 2

2

Perhaps you could supply more information regarding your models and what you are trying to achieve. Something like this might help:

models.py

class Article(models.Model):
    category = models.ForeignKey(Category, related_name='article')
    ...

Where ever you return a queryset in views:

def get_context_data(self, **kwargs):
    context = super(ArticleView, self).get_context_data(**kwargs)
    context['articles'] = Article.objects.all().select_related('category')
    return context

In templates:

{% for article in articles %}
    {% for category in article.category %}
        {{ category.get_absolute_url }}/{{ category.slug }} # this will return a string: abs_url/slug
    {% endfor %}
{% endfor %}    

Read about select_related here: https://docs.djangoproject.com/en/dev/ref/models/querysets/#select-related

You could also take a look at implementing Managers: https://docs.djangoproject.com/en/dev/topics/db/managers/#django.db.models.Manager

于 2013-08-13T20:00:52.343 回答
0

最后,我克服了这个问题,抛出了下面的解决方案,首先,我的意图一直是得到类似 /c/slug_category_parent/slug_first_children/.../last_children 的东西。我已经在settings.py中解决了这个解决方案:

cat_url= lambda c: cat_url(c.parent) + '/' +c.slug if c.parent else '/c/'+ c.sl
ABSOLUTE_URL_OVERRIDES = {
    'categories.category': lambda c: cat_url(c),
}
于 2013-08-14T20:33:18.690 回答