Django OneToOneField - Вставка записи в другую модель

У меня есть следующие модели. В модели ItemSettings изначально нет вставленных записей. У меня есть HTML таблица со ссылкой Правила для вставки данных настроек для каждого номера товара в ItemMaster. При добавлении данных ItemSettings. Модель ItemSettings будет иметь собственное представление для редактирования деталей настроек после вставки. Я не хочу, чтобы ItemNumber отображался в виде выпадающего списка выбора. В модели ItemSettings может быть только одна запись. Я не могу добиться добавления записи в модели ItemSettings с помощью приведенного ниже кода. Что я делаю неправильно?

Models.py:

class ItemMaster(models.Model):
    project_name = models.ForeignKey(ProjectMaster, null=True, on_delete=models.SET_NULL)
    item_number = models.CharField(max_length=15, unique=True, error_messages={
        'unique': "This Item Number Already Exists!"})
    item_type = models.ForeignKey(ItemType, null=True, on_delete=models.SET_NULL)
    item_description = models.CharField(max_length=255, blank=True, null=True)
    
    def __str__(self):
        return self.item_number

class ItemSettings(models.Model):
    item_number = models.OneToOneField(ItemMaster, on_delete=models.CASCADE)
    low_at = models.FloatField(default=0)
    minimum_value = models.FloatField(default=0)
    maximum_value = models.FloatField(default=0)
    
    def __str__(self):
        return str(self.item_number)

Views.py:

    def itemsettings_edit(request, pkey):
    item_master_data = ItemMaster.objects.get(id=pkey)
    item_no = item_master_data.item_number
    form = ItemSettingsForm()
    if request.method == "GET":
        return render(request, 'masters/edit.html', {'item_no': item_no})
    elif request.method == 'POST':
        try:
            item_number = request.POST['item_no']
            low_at = request.POST['low_at']
            minimum_value = request.POST['minimum_value']
            maximum_value = request.POST['maximum_value']
            form = ItemSettingsForm(request.POST)
            ItemSettings(item_number=item_number, low_at=low_at, 
minimum_value=minimum_value, maximum_value=maximum_value).save()
            messages.SUCCESS(request, 'Data Saved')
        except Exception as e:
            messages.SUCCESS(request, 'Data Already Added!!!')
    return render(request, 'masters/edit.html', {'item_no': item_no, 'form': form})

edit.html:

    <form action="" enctype="multipart/form-data" method="POST" novalidate>
    {% csrf_token %}
    <table>
        <tr>
            <td>Item No.</td>
            <td><input name="item_number" readonly type="text" value="{{ item_no }}"></td>
        </tr>
        <tr>
            <td>Low At</td>
            <td><input name="low_at" type="text"></td>
        </tr>
        <tr>
            <td>Minimum</td>
            <td><input name="minimum_value" type="text"></td>
        </tr>
        <tr>
            <td>Maximum</td>
            <td><input name="maximum_value" type="text"></td>
        </tr>
    </table>
    <div class="card-action">
        <button class="btn waves-effect waves-light btn-small" name="action"
                type="submit">Save
        </button>
        <a class="btn grey darken-3 waves-effect waves-light btn-small"
           href="{% url 'itemMaster_list' %}">Cancel</a>
    </div>
</form>

enter image description here

Возможно, когда вы получаете данные таким образом.

номер_элемента = request.POST['item_no']

получается неправильно, потому что когда вы хотите сохранить данные с моделью отношений, вы должны сохранить данные как экземпляр из модели, как например:

ItemMaster.objects.get(id=request.POST['item_no'])

и передайте результат в ItemSettings.item_number.

Если вы правильно посмотрели, то в HTML поле item_number называется item_number, а не item_no, поэтому оно должно быть:

item_number = request.POST['item_number'] #This is the right name.
...
...
Вернуться на верх