我在模型中有四个字段,其中一个是外键字段,另外三个是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.
class Meta:
model = ProductSize
fields = ['product','size','colour','cupsize']
在这里,模型应该是
model = ProductAttributes
由于你在此处指定的模型ProductSize
确实存在,因此提交表单将仅创建另一个实例进行ProductSize
建模,而无需那些特定的字段和错误消息。你可以检查你的管理页面。
编辑****** 2.根据你在问题和错误消息中添加的内容,你似乎attribute_create
正在传递产品的pk。现在attribute_create
,你正在通过初始命令{'product': pk}
。这是错误的,因为在你ProductAttributesForm
的product
字段中,该字段应该是实例,而不是pk
。
你需要将产品称为
product = Product.objects.filter(pk=pk)
initial = {'product':product}
当前的错误消息将消失,但是你将遇到其他错误。
我想念的是一件严肃的事情,谢谢。该表格目前未提交。遇到错误
the server responded with a status of 500 (Internal Server Error)
很高兴它解决了您的问题。我希望django可以针对这种情况发出警告消息,例如找不到字段。.当没有错误消息时,很难找到解决方案。
我刚刚编辑了我的评论,请看一看。
您是否正在尝试通过Ajax提交表单?500错误通常与Ajax相关。你有ajax代码吗?
self.field.remote_field.model._meta.object_name, ValueError: Cannot assign "111": "ProductAttributes.product" must be a "Product" instance
。