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>
Возможно, когда вы получаете данные таким образом.
номер_элемента = 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.
...
...