首页 > 解决方案 > /new 处的 ValueError 无法分配“'Home'”:“Listing.category”必须是“Category”实例

问题描述

我正在尝试创建一个新列表,但出现此错误:

(ValueError at /new
Cannot assign "'Work'": "Listing.category" must be a "Category" instance.)

模型.py

class Category(models.Model):
    category = models.CharField(max_length=64)
    
    def __str__(self):
        return self.category

class Listing(models.Model):
    title = models.CharField(max_length=64, default="")
    starting_bid = models.CharField(max_length=64, default="$")
    description = models.TextField(default="")
    image_url = models.CharField(max_length=200, default="")
    date = models.DateTimeField(default=timezone.now)
    category = models.ForeignKey(Category, on_delete=models.CASCADE)

    def __str__(self):
        return self.title

视图.py

def new_listing(request):
    if request.method == "POST":
        title = request.POST["title"]
        starting_bid = request.POST["starting_bid"]
        image_url = request.POST["image_url"]
        category = request.POST["category"]
        description = request.POST["description"]


        ins = Listing(title=title, starting_bid=starting_bid, image_url=image_url, category=category, description=description)
        ins.save()
    categories = Category.objects.filter()

    return render(request, "auctions/new_listing.html", { "categories": categories })

标签: pythondjangodjango-models

解决方案


要将值设置为ForeignKey您需要一个对象。

(/new 处的 ValueError 无法分配“'Work'”:“Listing.category”必须是“Category”实例。)

您可以使用_id末尾的属性或使用 Category 对象。

category_id=category
# Get category object
Category.objects.get(name=category)

视图.py:


def new_listing(request):
    if request.method == "POST":
        query = request.POST
        title = query.get("title")
        starting_bid = query.get("starting_bid")
        image_url = query.get("image_url")
        category = query.get("category")
        description = query.get("description")

        category_obj = Category.objects.get(name=category)
        """
        ins = Listing(
            title=title, starting_bid=starting_bid, 
            image_url=image_url, category_id=category, 
            description=description
        )
        """
        # OR
        ins = Listing(
            title=title, starting_bid=starting_bid, 
            image_url=image_url, category=category_obj, 
            description=description
        )
        ins.save()
    categories = Category.objects.all()

    return render(request, "auctions/new_listing.html", { "categories": categories })

在幕后,Django 将“_id”附加到字段名称以创建其数据库列名称,请参阅Django ForeignKey


我还建议您使用表单


推荐阅读