DsTProductAttributes.product должен быть экземпляром DsTProductCompany Django
Это мое первое сообщение на Stack Overflow, я задаю вопрос, на который, очевидно, уже был дан ответ, но я не могу найти решение для моего конкретного случая.
Я новичок в Django, поэтому, пожалуйста, не будьте слишком строги.
Заранее большое спасибо за то, что прочитали мой пост.
Любые советы или указания будут высоко оценены.
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.
Спасибо всем за ответы, однако я обнаружил проблему.
Логически говоря, в таблице ds_t_product_attributes и ds_t_product_company было установлено неправильное отношение.
После изменения все наладилось.
Спасибо всем
A.