提交带有外键的Django表单

问题描述

我正在尝试发送一个表单,该表单将使用Django在我的表Listing中添加一个新的“项目” /行。

我确定问题在于我正在使用ForeignKey并继续收到以下错误

ValueError: Cannot assign "'2'": "Listing.category" must be a "Category" instance.

请注意,上面的值2只是我拥有的7个选项之一。

我在Models.py中定义的“类别”表当前按以下方式填充:

(id) : (category)
    7 : Book
    6 : Technology
    5 : Beauty
    4 : Clothing
    3 : Health
    2 : Sports
    1 : Grocery

Models.py:

class Category(models.Model):
    category = models.CharField(max_length=16)
    
    def __str__(self):
        
        return f"{self.id} : {self.category}"

class Listing(models.Model):
    owner = models.CharField(max_length=64)
    title = models.CharField(max_length=64)
    description = models.CharField(max_length=256)
    startingBid = models.IntegerField()
    link = models.CharField(max_length=1024,blank=True)
    category = models.ForeignKey(Category,on_delete=models.CASCADE,related_name="category_id")
    time = models.DateTimeField(auto_Now_add=True)

    def __str__(self):
        return f'"{self.title}" added by {self.owner}'

Views.py

    class Create(forms.Form):
        CHOICES = (
            (1,'Grocery'),(2,'Sports'),(3,'Health'),(4,'Clothing'),(5,'Beauty'),(6,'Technology'),(7,'Book'),)
        owner = forms.CharField(widget=forms.TextInput(attrs={'placeholder': 'Your Username'}))
        title = forms.CharField(widget=forms.TextInput(attrs={'placeholder': 'What is your item?'}))
        description = forms.CharField(widget=forms.Textarea(attrs={'placeholder': 'Max 256 characters'}))
        link = forms.URLField(required=False)
        startingBid = forms.IntegerField()
        category = forms.ChoiceField(choices=CHOICES)
    
    @login_required
    def create_listing(request):
        if request.method == "POST":
            form = Create(request.POST)
            if form.is_valid():
                owner = form.cleaned_data["owner"]
                title = form.cleaned_data["title"]
                description = form.cleaned_data["description"]
                link = form.cleaned_data["link"]
                startingBid = form.cleaned_data["startingBid"]
                category = form.cleaned_data["category"]
    
                item = Listing(owner=owner,title=title,description=description,link=link,startingBid=startingBid,category=category)
                item.save()
    
        else:
            return render(request,"auctions/create_listing.html",{
                    "create": Create()
                    })

出于故障排除的目的,我手动对类别的ID或英语单词进行了硬编码,而不是传递category = category(例如,category ='Sports'或category ='4'),但这不能解决问题。

我也浏览了几篇类似的文章,但最终无法提出建议。

我确定我的问题很基本,但是我似乎无法理解问题的根本原因。

期待得到您的帮助!

解决方法

尝试一下:

item = Listing(owner=owner,title=title,description=description,link=link,startingBid=startingBid,category_id=category)

类别需要一个对象,而您传递的是id,因此如果传递的是id,category_id应该可以解决问题。

如果要通过类别选择,则应该尝试:

item = Listing(owner=owner,category__category=category)
,

在模型列出 类别中是一个外键,由于错误提示,您应该存储类别的实例。

尝试一下:

category = Category.object.filter(id = form.cleaned_data["category"]).first()

item = Listing(owner=owner,category=category)