DsTProductAttributes.product 必须是 DsTProductCompany 实例 Django
DsTProductAttributes.product must be a DsTProductCompany instance Django
这将是我在 Stack Overflow 上的第一个 post,我问的问题显然已经得到解答,但我找不到适合我的具体情况的解决方案。
我是 Django 的初学者所以请不要太难。
提前非常感谢您阅读我的post。
如有任何建议或指示,我们将不胜感激。
A.
我收到这个错误:
Cannot assign "2": "DsTProductAttributes.product" must be a "DsTProductCompany" instance.
这里是来自models.py
的相关代码
class DsTProductAttributes(models.Model):
product_attribute_id = models.BigAutoField(primary_key=True)
product = models.ForeignKey('DsTProductCompany', models.DO_NOTHING)
attribute = models.ForeignKey(DsTAttribute, models.DO_NOTHING)
value = models.DecimalField(
max_digits=10, decimal_places=2, blank=True, null=True)
dw_load = models.DateTimeField(blank=True, null=True)
dw_deleted = models.IntegerField(blank=True, null=True)
dw_deleted_time = models.DateTimeField(blank=True, null=True)
dw_last_touch = models.DateTimeField(blank=True, null=True)
dw_last_touch_by = models.CharField(max_length=200, blank=True, null=True)
class Meta:
managed = False
db_table = 'ds_t_product_attributes'
class DsTProductCompany(models.Model):
product_id = models.BigAutoField(primary_key=True)
product_code = models.CharField(max_length=200, blank=True, null=True)
description = models.CharField(max_length=200, blank=True, null=True)
ean_code = models.CharField(max_length=200, blank=True, null=True)
dw_load = models.DateTimeField(blank=True, null=True)
dw_deleted = models.IntegerField(blank=True, null=True)
dw_deleted_time = models.DateTimeField(blank=True, null=True)
dw_last_touch = models.DateTimeField(blank=True, null=True)
dw_last_touch_by = models.CharField(max_length=200, blank=True, null=True)
class Meta:
managed = False
db_table = 'ds_t_product_company'
这里是来自forms.py
的相关代码
class ProductAttributesForm(ModelForm):
def __init__(self, *args, **kwargs):
super(ProductAttributesForm, self).__init__(*args, **kwargs)
attribute = DsTAttribute.objects.all()
attribute_id = [(i.attribute_id, i.attribute_code) for i in attribute]
self.fields['attribute_id'] = forms.ChoiceField(choices=attribute_id)
product = forms.IntegerField(
widget=forms.HiddenInput()
)
class Meta:
model = DsTProductAttributes
fields = ['product', 'value']
这里是来自views.py
的相关代码
def productAttributeCreate(request, pk):
form = ProductAttributesForm()
product_id = pk
form.fields['product'].initial = product_id
btnValue = "Create"
if request.method == "POST":
form = ProductAttributesForm(request.POST, request.FILES)
if form.is_valid():
form.save()
return redirect('products')
context = {'form': form, 'btnValue': btnValue, 'product_id': product_id}
return render(request, 'base/product_attributes/product_attributes_form.html', context)
这里是使用的模板:
{% extends 'base/main.html' %}
{% load static %}
{% load crispy_forms_tags %}
{% block content %}
<br />
<div class="container-fluid">
<form action="" method="POST" enctype="multipart/form-data">
{% csrf_token %}
{{form.media}}
{{form|crispy}}
<input class="btn btn-success" type="submit" value="{{btnValue}}">
</form>
</div>
<br/>
<center><a class="btn btn-primary btn-lg" href="{% url 'product' product_id %}" role="button">Back</a></center>
{% endblock content %}
这是完整的回溯:
Environment:
Request Method: POST
Request URL: http://127.0.0.1:8000/create_product_attribute/2
Django Version: 3.2.7
Python Version: 3.8.7
Installed Applications:
['django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'base.apps.BaseConfig',
'django_filters',
'crispy_forms']
Installed Middleware:
['whitenoise.middleware.WhiteNoiseMiddleware',
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware']
Traceback (most recent call last):
File "C:\Users\stefa\PycharmProjects\Dashboard\venv\lib\site-packages\django\core\handlers\exception.py", line 47, in inner
response = get_response(request)
File "C:\Users\stefa\PycharmProjects\Dashboard\venv\lib\site-packages\django\core\handlers\base.py", line 181, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:\Users\stefa\PycharmProjects\Dashboard\dashboard\base\views.py", line 46, in productAttributeCreate
if form.is_valid():
File "C:\Users\stefa\PycharmProjects\Dashboard\venv\lib\site-packages\django\forms\forms.py", line 175, in is_valid
return self.is_bound and not self.errors
File "C:\Users\stefa\PycharmProjects\Dashboard\venv\lib\site-packages\django\forms\forms.py", line 170, in errors
self.full_clean()
File "C:\Users\stefa\PycharmProjects\Dashboard\venv\lib\site-packages\django\forms\forms.py", line 374, in full_clean
self._post_clean()
File "C:\Users\stefa\PycharmProjects\Dashboard\venv\lib\site-packages\django\forms\models.py", line 408, in _post_clean
self.instance = construct_instance(self, self.instance, opts.fields, opts.exclude)
File "C:\Users\stefa\PycharmProjects\Dashboard\venv\lib\site-packages\django\forms\models.py", line 63, in construct_instance
f.save_form_data(instance, cleaned_data[f.name])
File "C:\Users\stefa\PycharmProjects\Dashboard\venv\lib\site-packages\django\db\models\fields\__init__.py", line 910, in save_form_data
setattr(instance, self.name, data)
File "C:\Users\stefa\PycharmProjects\Dashboard\venv\lib\site-packages\django\db\models\fields\related_descriptors.py", line 215, in __set__
raise ValueError(
Exception Type: ValueError at /create_product_attribute/2
Exception Value: Cannot assign "2": "DsTProductAttributes.product" must be a "DsTProductCompany" instance.
谢谢大家的回答,不过我发现了问题。
从逻辑上讲,table ds_t_product_attributes 和 ds_t_product_company 建立了错误的关系。
一改,万事大吉
谢谢大家
A.
这将是我在 Stack Overflow 上的第一个 post,我问的问题显然已经得到解答,但我找不到适合我的具体情况的解决方案。
我是 Django 的初学者所以请不要太难。
提前非常感谢您阅读我的post。
如有任何建议或指示,我们将不胜感激。
A.
我收到这个错误:
Cannot assign "2": "DsTProductAttributes.product" must be a "DsTProductCompany" instance.
这里是来自models.py
的相关代码class DsTProductAttributes(models.Model):
product_attribute_id = models.BigAutoField(primary_key=True)
product = models.ForeignKey('DsTProductCompany', models.DO_NOTHING)
attribute = models.ForeignKey(DsTAttribute, models.DO_NOTHING)
value = models.DecimalField(
max_digits=10, decimal_places=2, blank=True, null=True)
dw_load = models.DateTimeField(blank=True, null=True)
dw_deleted = models.IntegerField(blank=True, null=True)
dw_deleted_time = models.DateTimeField(blank=True, null=True)
dw_last_touch = models.DateTimeField(blank=True, null=True)
dw_last_touch_by = models.CharField(max_length=200, blank=True, null=True)
class Meta:
managed = False
db_table = 'ds_t_product_attributes'
class DsTProductCompany(models.Model):
product_id = models.BigAutoField(primary_key=True)
product_code = models.CharField(max_length=200, blank=True, null=True)
description = models.CharField(max_length=200, blank=True, null=True)
ean_code = models.CharField(max_length=200, blank=True, null=True)
dw_load = models.DateTimeField(blank=True, null=True)
dw_deleted = models.IntegerField(blank=True, null=True)
dw_deleted_time = models.DateTimeField(blank=True, null=True)
dw_last_touch = models.DateTimeField(blank=True, null=True)
dw_last_touch_by = models.CharField(max_length=200, blank=True, null=True)
class Meta:
managed = False
db_table = 'ds_t_product_company'
这里是来自forms.py
的相关代码class ProductAttributesForm(ModelForm):
def __init__(self, *args, **kwargs):
super(ProductAttributesForm, self).__init__(*args, **kwargs)
attribute = DsTAttribute.objects.all()
attribute_id = [(i.attribute_id, i.attribute_code) for i in attribute]
self.fields['attribute_id'] = forms.ChoiceField(choices=attribute_id)
product = forms.IntegerField(
widget=forms.HiddenInput()
)
class Meta:
model = DsTProductAttributes
fields = ['product', 'value']
这里是来自views.py
的相关代码def productAttributeCreate(request, pk):
form = ProductAttributesForm()
product_id = pk
form.fields['product'].initial = product_id
btnValue = "Create"
if request.method == "POST":
form = ProductAttributesForm(request.POST, request.FILES)
if form.is_valid():
form.save()
return redirect('products')
context = {'form': form, 'btnValue': btnValue, 'product_id': product_id}
return render(request, 'base/product_attributes/product_attributes_form.html', context)
这里是使用的模板:
{% extends 'base/main.html' %}
{% load static %}
{% load crispy_forms_tags %}
{% block content %}
<br />
<div class="container-fluid">
<form action="" method="POST" enctype="multipart/form-data">
{% csrf_token %}
{{form.media}}
{{form|crispy}}
<input class="btn btn-success" type="submit" value="{{btnValue}}">
</form>
</div>
<br/>
<center><a class="btn btn-primary btn-lg" href="{% url 'product' product_id %}" role="button">Back</a></center>
{% endblock content %}
这是完整的回溯:
Environment:
Request Method: POST
Request URL: http://127.0.0.1:8000/create_product_attribute/2
Django Version: 3.2.7
Python Version: 3.8.7
Installed Applications:
['django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'base.apps.BaseConfig',
'django_filters',
'crispy_forms']
Installed Middleware:
['whitenoise.middleware.WhiteNoiseMiddleware',
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware']
Traceback (most recent call last):
File "C:\Users\stefa\PycharmProjects\Dashboard\venv\lib\site-packages\django\core\handlers\exception.py", line 47, in inner
response = get_response(request)
File "C:\Users\stefa\PycharmProjects\Dashboard\venv\lib\site-packages\django\core\handlers\base.py", line 181, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:\Users\stefa\PycharmProjects\Dashboard\dashboard\base\views.py", line 46, in productAttributeCreate
if form.is_valid():
File "C:\Users\stefa\PycharmProjects\Dashboard\venv\lib\site-packages\django\forms\forms.py", line 175, in is_valid
return self.is_bound and not self.errors
File "C:\Users\stefa\PycharmProjects\Dashboard\venv\lib\site-packages\django\forms\forms.py", line 170, in errors
self.full_clean()
File "C:\Users\stefa\PycharmProjects\Dashboard\venv\lib\site-packages\django\forms\forms.py", line 374, in full_clean
self._post_clean()
File "C:\Users\stefa\PycharmProjects\Dashboard\venv\lib\site-packages\django\forms\models.py", line 408, in _post_clean
self.instance = construct_instance(self, self.instance, opts.fields, opts.exclude)
File "C:\Users\stefa\PycharmProjects\Dashboard\venv\lib\site-packages\django\forms\models.py", line 63, in construct_instance
f.save_form_data(instance, cleaned_data[f.name])
File "C:\Users\stefa\PycharmProjects\Dashboard\venv\lib\site-packages\django\db\models\fields\__init__.py", line 910, in save_form_data
setattr(instance, self.name, data)
File "C:\Users\stefa\PycharmProjects\Dashboard\venv\lib\site-packages\django\db\models\fields\related_descriptors.py", line 215, in __set__
raise ValueError(
Exception Type: ValueError at /create_product_attribute/2
Exception Value: Cannot assign "2": "DsTProductAttributes.product" must be a "DsTProductCompany" instance.
谢谢大家的回答,不过我发现了问题。
从逻辑上讲,table ds_t_product_attributes 和 ds_t_product_company 建立了错误的关系。
一改,万事大吉
谢谢大家
A.