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
相关产品推荐
相关产品推荐

