Warm tip: This article is reproduced from serverfault.com, please click

django-ValueError:无法分配值:必须是一个实例

(django - ValueError: Cannot assign value: must be an instance)

发布于 2020-11-28 11:59:08

我在模型中有四个字段,其中一个是外键字段,另外三个是m2m字段。表单已在模式中打开,但未保存数据,错误在下面给出。我不明白我做错了什么。我将非常感谢你的帮助。

模型:

class ProductAttributes(models.Model):
    product     = models.ForeignKey('Product', blank=True, null=True, on_delete=models.SET_NULL)
    size        = models.ManyToManyField('ProductSize', blank=True)
    colour      = models.ManyToManyField('ProductColour', blank=True)
    cupsize     = models.ManyToManyField('ProductCupSize', blank=True)

    def __str__(self):
        return self.product

形式:

class ProductAttributesForm(forms.ModelForm):
    product     = forms.IntegerField(label=('ID'),required=True, disabled=True)
    size        = forms.ModelMultipleChoiceField(queryset=ProductSize.objects.all(),widget=Select2MultipleWidget, required=False)
    colour      = forms.ModelMultipleChoiceField(queryset=ProductColour.objects.all(),widget=Select2MultipleWidget, required=False)
    cupsize     = forms.ModelMultipleChoiceField(queryset=ProductCupSize.objects.all(),widget=Select2MultipleWidget, required=False)

    class Meta:
        model = ProductAttributes
        fields = ['product','size','colour','cupsize']

模板:

{% load crispy_forms_tags %}

<form id="Form" method="post" action="{% url 'accpack:products_attributes_create' product %}" class="js-product-create-form col s12" >
    {% csrf_token %}
    {% crispy form form.helper %}
</form>

看法:

def save_attribute_form(request, form, template_name, pk):
    data = dict()
    if request.method == 'POST':
        if form.is_valid():
            form.save()
            data['form_is_valid'] = True
        else:
            data['form_is_valid'] = False
    context = {'form': form, 'product':pk}
    data['html_form'] = render_to_string(template_name, context, request=request)
    return JsonResponse(data)

def attribute_create(request, pk):
    if request.method == 'POST':
        form = ProductAttributesForm(request.POST, initial={'product': pk})
    else:
        form = ProductAttributesForm(initial={'product': pk})
    return save_attribute_form(request, form, 'main/products/partial_product_attribute_form.html', pk)

阿贾克斯:

 var saveForm = function () {
    var form = $(this);
    $.ajax({
      url: form.attr("action"),
      data: form.serialize(),
      type: form.attr("method"),
      dataType: 'json',
      success: function (data) {
        if (data.form_is_valid) {
          $("#modal-product_attribute").modal("hide");
          console.log(data.form_data);
        }
        else {
          $("#modal-product_attribute .modal-content").html(data.html_form);
        }
      }
    });
    return false;
  $("#modal-product_attribute").on("submit", ".js-product-create-form", saveForm);

错误:

File "C:\ProgramData\Anaconda3\envs\djangoproject\lib\site-packages\django\db\models\fields\related_descriptors.py", line 220, in __set__
    self.field.remote_field.model._meta.object_name,
ValueError: Cannot assign "111": "ProductAttributes.product" must be a "Product" instance.
Questioner
Abzal Ali
Viewed
11
ha-neul 2020-11-30 00:37:01
  1. 你的forms.py中有错误。
    class Meta:
        model = ProductSize
        fields = ['product','size','colour','cupsize']

在这里,模型应该是

      model = ProductAttributes

由于你在此处指定的模型ProductSize确实存在,因此提交表单将仅创建另一个实例进行ProductSize建模,而无需那些特定的字段和错误消息。你可以检查你的管理页面。

编辑****** 2.根据你在问题和错误消息中添加的内容,你似乎attribute_create正在传递产品的pk。现在attribute_create,你正在通过初始命令{'product': pk}这是错误的,因为在你ProductAttributesFormproduct字段,该字段应该是实例,而不是pk

你需要将产品称为

product = Product.objects.filter(pk=pk)
initial = {'product':product}

当前的错误消息将消失,但是你将遇到其他错误。