【问题标题】:Submit Django Form with Foreign Key使用外键提交 Django 表单
【发布时间】:2020-12-30 17:26:49
【问题描述】:

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

我确信问题在于我使用 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'),但这并不能解决问题。

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

我确信我的问题相当基本,但我似乎无法理解问题的根本原因。

期待得到您的帮助!

【问题讨论】:

    标签: python django django-models django-forms foreign-keys


    【解决方案1】:

    试试这个:

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

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

    如果您通过类别选择,那么您应该尝试:

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

    【讨论】:

      【解决方案2】:

      在模型 Listing category 中是外键,错误提示您应该存储 Category 的实例。

      试试这个:

      category = Category.object.filter(id = form.cleaned_data["category"]).first()
      
      item = Listing(owner=owner, title=title, description=description, link=link, startingBid=startingBid, category=category)
      

      【讨论】:

        猜你喜欢
        • 2018-10-28
        • 2019-11-16
        • 2019-03-08
        • 1970-01-01
        • 2021-08-28
        • 2011-09-01
        • 2017-07-26
        • 2017-06-11
        • 2017-05-13
        相关资源
        最近更新 更多