回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>我试图通过html表单编辑django数据库。但是我不确定为什么会出现以下错误。产品类别是外键,我不能更改它的值。我怎样才能解决这个错误?谢谢您。在</p>
<blockquote>
<p>ValueError at /shop/polyester-cushions/eiffel/edit_product/ Cannot
assign "'Polyester Cushions'": "Product.category" must be a "Category"
instance.</p>
</blockquote>
<p>在模型.py在</p>
<pre><code>from django.db import models
from django.urls import reverse
from django.contrib.auth.models import User
class Category(models.Model):
name = models.CharField(max_length=250, unique=True)
slug = models.SlugField(max_length=250, unique=True)
description = models.TextField(blank=True)
image = models.ImageField(upload_to='category', blank=True)
def __str__(self):
return '{}'.format(self.name)
class Product(models.Model):
CATEGORY_CHOICES = (
("Cotton Cushions", "Cotton Cushions"),
("Polyester Cushions", "Polyester Cushions")
)
name = models.CharField(max_length=250, unique=True)
slug = models.SlugField(max_length=250, unique=True)
description = models.TextField(blank=True)
category = models.ForeignKey(Category, on_delete=models.CASCADE, choices=CATEGORY_CHOICES)
price = models.DecimalField(max_digits=10, decimal_places=2)
def __str__(self):
return '{}'.format(self.name)
</code></pre>
<p>编辑_产品.html在</p>
^{pr2}$
<p>在视图.py在</p>
<pre><code>@login_required(login_url="/")
def EditProduct(request, c_slug, product_slug):
try:
product = Product.objects.get(category__slug=c_slug, slug=product_slug)
error = ''
if request.method == 'POST':
product_form = ProductForm(request.POST, request.FILES, instance=product)
if product_form.is_valid():
product.save()
return redirect('shop/my_products.html/')
else:
error = "Data is not valid"
return render(request, 'shop/edit_product.html', {'product':product, 'error':error})
except Product.DoesNotExist:
return redirect('/')
</code></pre>
<p>在表单.py在</p>
<pre><code>from django import forms
from django.forms import ModelForm
from .models import Product
class ProductForm(ModelForm):
class Meta:
model = Product
fields = ('name','slug','description','category','price','image','stock','available')
</code></pre>