Django:如何编辑设置了外键字段的页面(无法编辑和发布到模型)

2024-09-29 23:33:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图通过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')

Tags: djangonamefromimporttruereturnmodelsrequest
3条回答

如果您正在使用ForeignKey字段,请不要在其中传递choices属性。Category模型的对象将作为其选择。在

Product模型的category字段中删除{}属性

category = models.ForeignKey(Category, on_delete=models.CASCADE)

Do not forget to run makemigrations and migrate command after removing choices from field

在模板中使用{{form}}上下文变量inspite of manually rendering form

如果要手动呈现,请使用category对象的pk作为选项值。并在所有类别对象上循环。在

更新

从url中删除c_slug,并将您的EditProduct视图修改为

^{pr2}$

Note: create edit product_form form when the request is GET and send product_form in context instead of product to the template

edit_product.html中,只需使用下面的代码来呈现表单

<form method="post">
  {% csrf_token %}
  {{product_form}}
  <input type="submit" value="submit"/>
</form>

请尝试以下代码:

通常html是这样的:

<form method="post">{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="ok">
</form>

在模型.py(您可能需要运行makemigrations和migrate)

^{pr2}$

在视图.py(或者可以使用django的UpdateView)

@login_required(login_url="/")
def EditProduct(request, c_slug, product_slug):
    try:
        product = Product.objects.get(category__slug=c_slug, slug=product_slug)
    except Product.DoesNotExist:
        return redirect('/')
    if request.method == 'POST':
        form = ProductForm(request.POST, request.FILES, instance=product)
        if form.is_valid():
            form.save()
            return redirect('shop/my_products.html')
    else:
        form = ProductForm(instance=product)
    return render(request, 'shop/edit_product.html', {'form': form})

请检查数据库中的产品表类别字段名。它是一把外国钥匙。它可以更改文件名,如添加类别\u id

相关问题 更多 >

    热门问题