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.