Django:Django字段“ id”应为数字,但得到“ <string>”

时间:2020-05-15 18:54:11

标签: python html django

我正在尝试为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 %} 

2 个答案:

答案 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'),

在路径可行之后添加带有斜杠(/)的任何内容吗?!...