You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CS50W Commerce项目创建Listing遇TypeError:'description'参数异常

CS50W Commerce 创建商品列表时 TypeError: Listing() got unexpected keyword arguments: 'description' 解决方法

核心错误原因

触发该错误的直接原因是你的Listing模型未定义description字段,但在createListing视图中创建Listing实例时传入了description参数,Django找不到对应字段就抛出了类型错误。

以下是完整的修复步骤,包含所有隐藏问题的修正:


1. 给Listing模型补充缺失字段并修复语法错误

修改models.py,补上description字段,同时修复其他语法问题:

from django.db import models
from django.contrib.auth.models import AbstractUser  # 补上缺失的AbstractUser导入

class User(AbstractUser):
    pass

class Category(models.Model):
    categoryName = models.CharField(max_length=50)

    def __str__(self):
        return self.categoryName

class Listing(models.Model):
    title = models.CharField(max_length=30)
    description = models.TextField()  # 新增描述字段,用TextField适配长文本
    imageUrl = models.CharField(max_length=300)
    price = models.FloatField()  # FloatField不需要max_length参数,直接移除
    isActive = models.BooleanField(default=True)
    owner = models.ForeignKey(User, on_delete=models.CASCADE, blank=True, null=True, related_name="user")
    category = models.ForeignKey(Category, on_delete=models.CASCADE, blank=True, null=True, related_name="category")

    def __str__(self):  # 修复缩进,归属于Listing类(原代码是全局函数)
        return self.title

2. 修复create.html表单的name属性缺失问题

原表单控件只有id没有name,导致Django无法通过request.POST获取提交值。给每个输入控件添加name属性:

{% extends "auctions/layout.html" %}

{% block body %}
    <h2>Create Listing</h2>
    <form action="{% url 'create' %}" method="POST">
        {% csrf_token %}
        <div class="form-group">
            <label for="title">Title</label>
            <input type="text" class="form-control" id="title" name="title" placeholder="Enter Title:">
        </div>
        <div class="form-group">
            <label for="description">Description</label>
            <input type="text" class="form-control" id="description" name="description" placeholder="Enter description:">
        </div>
        <div class="form-group">
            <label for="imageurl">Image</label>
            <input type="text" class="form-control" id="imageurl" name="imageurl" placeholder="Enter image url:">
        </div>
        <div class="form-group">
            <label for="price">Price</label>
            <input type="text" class="form-control" id="price" name="price" placeholder="Enter Price">
        </div>
        <div class="form-group">
            <label for="category">Choose a category:</label>
            <select name="category" id="category">
                {% for cat in categories %}
                    <option value="{{ cat.categoryName }}">{{ cat.categoryName }}</option>
                {% endfor %}
            </select>
        </div>
        <button type="submit" class="btn btn-success">Add listing</button>
    </form>
{% endblock %}

额外优化:将<option value="{{ cat }}">改为<option value="{{ cat.categoryName }}">,避免因__str__返回值变化导致的查询错误。

3. 修正createListing视图的类型转换与跳转错误

修改views.py中的createListing函数,修复价格类型不匹配、跳转参数错误等问题:

def createListing(request):
    if request.method=="GET":
        allCategories = Category.objects.all()
        return render(request, "auctions/create.html", {
            "categories": allCategories
        })
    else:
        title = request.POST.get("title")
        description = request.POST.get("description")
        imageurl = request.POST.get("imageurl")
        price = request.POST.get("price")
        category = request.POST.get("category")
        currentUser = request.user
        
        # 处理价格转换,避免非数字输入崩溃
        try:
            price_float = float(price)
        except ValueError:
            return render(request, "auctions/create.html", {
                "categories": Category.objects.all(),
                "error": "请输入有效的数字价格"
            })
        
        categoryData=Category.objects.get(categoryName=category)
        newListing = Listing(
            title = title,
            description = description,
            imageUrl = imageurl,
            price = price_float,  # 传入float类型匹配模型字段
            category = categoryData,
            owner = currentUser
        )
        newListing.save()
        return HttpResponseRedirect(reverse("index"))  # 用reverse生成正确URL,而非直接传视图函数

4. 修复displayCategory视图的类名大小写错误

原代码中category.objects.get是小写,需改为大写的Category类:

def displayCategory(request):
    if request.method == "POST":
        categoryFromForm = request.POST['category']
        category = Category.objects.get(categoryName=categoryFromForm)  # 类名大写
        activeListings = Listing.objects.filter(isActive=True, category=category)
        allCategories = Category.objects.all()
        return render(request, "auctions/index.html",{
            "listings": activeListings,
            "categories": allCategories
        })

最后执行数据库迁移

修改模型后必须运行以下命令更新数据库表结构:

python manage.py makemigrations
python manage.py migrate

完成以上步骤后,创建商品列表的功能即可正常工作。

内容的提问来源于stack exchange,提问作者Memetendo64

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 12:16:11