我试图通过html表单编辑django数据库。但是我不确定为什么会出现以下错误。产品类别是外键,我不能更改它的值。我怎样才能解决这个错误?谢谢您。在
ValueError at /shop/polyester-cushions/eiffel/edit_product/ Cannot assign "'Polyester Cushions'": "Product.category" must be a "Category" instance.
在模型.py在
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)
编辑_产品.html在
^{pr2}$在视图.py在
@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('/')
在表单.py在
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')
如果您正在使用
ForeignKey
字段,请不要在其中传递choices
属性。Category
模型的对象将作为其选择。在从}属性
Product
模型的category
字段中删除{在模板中使用
{{form}}
上下文变量inspite of manually rendering form如果要手动呈现,请使用category对象的
pk
作为选项值。并在所有类别对象上循环。在更新
从url中删除
^{pr2}$c_slug
,并将您的EditProduct
视图修改为在
edit_product.html
中,只需使用下面的代码来呈现表单请尝试以下代码:
通常html是这样的:
在模型.py(您可能需要运行makemigrations和migrate)
^{pr2}$在视图.py(或者可以使用django的UpdateView)
请检查数据库中的产品表类别字段名。它是一把外国钥匙。它可以更改文件名,如添加类别\u id
相关问题 更多 >
编程相关推荐