Создание одного объекта для нескольких моделей в одной форме
Это проект поддержки вендора. У меня есть три модели,
- Item
- DeliveryOrderForm
- TableList
Item определяет, какие товары продает продавец. DeliveryOrderForm сохраняет данные получателя/покупателя. TableList сохраняет информацию о каждой строке заказа, которую заказывает покупатель.
models.py
class Item(models.Model):
itemID = models.AutoField(unique=True,primary_key=True)
itemPrice = models.DecimalField(default=0,max_digits=19,decimal_places=2)
itemDescription = models.CharField(max_length=30)
#deliveryorder status
class Status(models.IntegerChoices):
pending = 1
disapproved = 2
approved = 3
class DeliveryOrderForm(models.Model):
deliveryOrderID = models.AutoField(unique=True,primary_key=True)
vendorName = models.CharField(max_length=30)
vendorAddress = models.CharField(max_length=200)
recipientName = models.CharField(max_length=30)
recipientPhone = PhoneNumberField(blank=False)
recipientAddress = models.CharField(max_length=200)
deliveryOrderStatus = models.IntegerField(default=Status.pending,choices=Status.choices)
deliveryOrderDate = models.DateTimeField(default=timezone.now)
class TableList(models.Model):
deliveryOrderID = models.ForeignKey(DeliveryOrderForm,on_delete = models.CASCADE)
itemID = models.ForeignKey(Item,on_delete=models.PROTECT)
itemQuantity = models.IntegerField(default=0)
Итак, на странице администратора создание объекта DeliveryOrderForm проходит нормально. Я также смог отобразить DeliveryOrderForm вместе с TableList.
Сейчас проблема заключается в попытке создать представление, которое работает для создания объекта DeliveryOrderForm.
Я пробовал это :
forms.py
class DOForm(ModelForm):
class Meta:
model = DeliveryOrderForm
fields = '__all__'
views.py
def createDeliveryOrder(request):
model = DeliveryOrderForm
template_name = 'deliveryorder/create.html'
deliveryOrderID = get_object_or_404(
model.objects.order_by('-deliveryOrderID')[:1]
)
formset = inlineformset_factory(DeliveryOrderForm,TableList, fields = [
'itemID',
'itemQuantity',
])
if request.method == 'POST':
form = DOForm(request.POST,prefix = 'deliveryorder')
if form.is_valid() and formset.has_changed():
form.save()
for form in formset:
formset.save()
return reverse_lazy('deliveryorder:index')
else:
if request.method == 'GET':
form = DOForm()
context = {
'deliveryOrderID':deliveryOrderID,
'form':form,
'formset':formset
}
return render(request,template_name,context)
Этот код, конечно, может отобразить соответствующие поля, но нажатие кнопки submit не сохраняет их данные в базе данных. Мне кажется, что проблема кроется в части сохранения формы, но я не совсем уверен, что это можно исправить.