我有两个型号 Post 和 Category .
models.py
class Post(models.Model):
title = models.CharField(max_length=100, unique=True)
slug = models.SlugField(max_length=100, unique=True)
content = models.TextField()
posted = models.DateField(db_index=True, auto_now_add=True)
category = models.ForeignKey('blog.Category')
def __unicode__(self):
return '%s' % self.title
class Category(models.Model):
title = models.CharField(max_length=100, db_index=True)
slug = models.SlugField(max_length=100, db_index=True)
def __unicode__(self):
return '%s' % self.title
views.py
def post_view(request, slug, slug1):
return render(request, 'post_view.html', {
'post': get_object_or_404(Post, category=slug, slug=slug1)
})
def category_view(request, slug):
category = get_object_or_404(Category, slug=slug)
return render(request, 'cat_view.html', {
'category': category,
'posts': Post.objects.filter()[:5]
})
urls.py
url(r'category/(?P<slug>[-\w]+)/$', views.category_view, name='cat_view'),
url(r'category/(?P<slug>[-\w]+)/(?P<slug1>[-\w]+)/$', views.post_view, name='post_view'),
最后是模板category.html
{% block content %}
{% if posts %}
<ul>
{% for post in posts %}
<li><a href="{% url 'blog:post_view' slug=post.category slug1=post.slug %}">
{{ post.title }}</a></li>
{% endfor %}
</ul>
{% else %}
<p>There are no post yet in the {{ category.title }} category ! </p>
{% endif %}
{% endblock %}
post.html
{% block content %}
<h1>{{ post.title }}</h1>
<p>{{ post.content }}</p>
<small>{{ post.posted }}</small>
{% endblock %}
每当我尝试通过 category.html
上的链接访问特定帖子时,就会出现错误 . 起初我认为这是因为 urls.py
中的正则表达式,但它似乎是查询的问题,我已经坚持了几个小时 . 任何帮助都会很棒 .
UPDATE
回溯:文件“C:\ Python27 \ lib \ site-packages \ django \ core \ handlers \ exception.py”在内部39. response = get_response(request)文件“C:\ Python27 \ lib \ site-packages \ django / core \ handlers \ base.py“in _get_response 187. response = self.process_exception_by_middleware(e,request)_get_response 185中的文件”C:\ Python27 \ lib \ site-packages \ django \ core \ handlers \ base.py“ . response = wrapped_callback(request,* callback_args,** callback_kwargs)post_view 25中的文件“C:\ Users \ godfather \ PycharmProjects \ portfolio \ blog \ views.py”.'post':get_object_or_404(Post,category = slug,slug = slug1)get_object_or_404中的文件“C:\ Python27 \ lib \ site-packages \ django \ shortcuts.py”85 . return queryset.get(* args,** kwargs)文件“C:\ Python27 \ lib \ site-packages \获取376中的django \ db \ models \ query.py“.clone = self.filter(* args,** kwargs)文件”C:\ Python27 \ lib \ site-packages \ django \ db \ models \ query.py“在过滤器796中 . 返回self.filter_or_exclude(False,* args,** kwargs)文件“C:\ Python27 \ lib \ site-packages \ django \ db \ models \ que ry.py“在_filter_or_exclude 814. clone.query.add_q(Q(* args,** kwargs))文件”C:\ Python27 \ lib \ site-packages \ django \ db \ models \ sql \ query.py“in add_q 1227. clause, = self._add_q(q_object,self.used_aliases)_add_q 1253中的文件“C:\ Python27 \ lib \ site-packages \ django \ db \ models \ sql \ query.py” . allow_joins = allow_joins, split_subq = split_subq,build_filter 1183中的文件“C:\ Python27 \ lib \ site-packages \ django \ db \ models \ sql \ query.py”.condition = lookup_class(lhs,value)文件“C:\ Python27 \ lib \ init-self中的site-packages \ django \ db \ models \ lookups.py“self.rhs = self.get_prep_lookup()文件”C:\ Python27 \ lib \ site-packages \ django \ db \ models \ fields \ related_lookups . py“in get_prep_lookup 100. self.rhs = target_field.get_prep_value(self.rhs)文件”C:\ Python27 \ lib \ site-packages \ django \ db \ models \ fields__init __ . py“in get_prep_value 946. return int(value)异常类型:ValueError at / category / Computer / python-data-scientists / Exception Value:int()的文字无效,基数为10:'计算机'
1 回答
在模板中,您将类别作为对象传递,而不是类别slug . 以下是您需要更改的内容:
{% url 'blog:post_view' slug=post.category.slug slug1=post.slug %}
我会更进一步,重命名一些东西 . 在你的 urls.py 中更改第二个网址:
url(r'category/(?P<category_slug>[-\w]+)/(?P<post_slug>[-\w]+)/$', views.post_view, name='post_view'),
然后调整 views.py 以反映更改:
def post_view(request, category_slug, post_slug): return render(request, 'post_view.html', { 'post': get_object_or_404(Post, category__slug=category_slug, slug=post_slug) })
请注意双下划线 . 这不是一个错字 .
命名很重要,特别是对于阅读代码的其他人 . slug和slug1的概念不是很具描述性 . 最好清楚哪一个是类别slug,哪一个是post slug .
如果您使用上述更改,那么您应该调整此行:
{% url 'blog:post_view' category_slug=post.category.slug post_slug=post.slug %}