我正在尝试为Django项目创建一个类别页面。我测试网址时一切正常。但是当我尝试传递用于过滤帖子的类别对象时,出现此错误:Field 'id' expected a number but got '<string>'
。
“ category”是我的Post模型中的外键,我知道它传递的默认值是id。如何传递字符串本身而不是ID?
这是我的模型。py:
from django.db import models
from django.contrib.auth.models import User
from datetime import datetime, date
class Category(models.Model):
name = models.CharField(max_length = 32, default='Uncategorized')
def __str__(self):
return self.name
class Post(models.Model):
...
category = models.ForeignKey(Category, on_delete=models.CASCADE)
...
def __str__(self):
return self.title + ' | ' + str(self.author)
这是我的views.py:
from django.shortcuts import render
from django.views.generic import ListView, DetailView
from .models import Post, Category
class BlogView(ListView):
model = Post
template_name = 'blog/blog.html'
ordering = ['-updated_on']
def get_context_data(self, *args, **kwargs):
categories = Category.objects.all()
context = super(BlogView, self).get_context_data(*args, **kwargs)
context['categories'] = categories
return context
def CategoryView(request, cats):
category_posts = Post.objects.filter(category=cats)
return render(request, 'blog/categories.html', {'cats': cats, 'category_posts': category_posts})
这是我的urls.py:
from django.urls import path
from . import views
urlpatterns = [
...
path('blog', views.BlogView.as_view(), name='blog'),
path('blog/<int:pk>', views.BlogDetailView.as_view(), name='blog-detail'),
path('category/<str:cats>/', views.CategoryView, name='category'),
...
]
这是我的HTML文件:
{% extends 'blog/base.html' %}
{% block title %}
| {{ cats }}
{% endblock %}
{% block body %}
...
<div class="header-container" >
<h1>{{ cats }}</h1>
</div>
...
{% endblock %}
答案 0 :(得分:1)
更改urls.py,
path('category/<str:cats>/', views.CategoryView, name='category'),
到
path('category/<int:cats>/', views.CategoryView, name='category'),
将参数强制为整数类型。
进行过滤查询时
category_posts = Post.objects.filter(category=cats)
category是外键,因此查询将使用category的主键并与输入参数“ cats”进行比较,并且它具有整数值。
答案 1 :(得分:0)
但是对于django 3.0.6和python 3.6.9,我遇到了简单的CBV相同的问题,例如TemplateView或ListView,它们不需要强制性参数。
下面的网址有效。
path('blog/dummy', views.BlogView.as_view(), name='blog_list'),
下面的错误不是,错误是:字段'id'需要一个数字,但抛出了'blog_list'。其中 blog_list 是网址的名称...
path('blog', views.BlogView.as_view(), name='blog_list'),
在路径可行之后添加带有斜杠(/)的任何内容吗?!...