Сохраните два экземпляра на одной модели в django

#django #django-models #django-views #django-forms #django-templates

Вопрос:

В моем случае это приложение для управления казначейством, задача состоит в том, что я хочу перевести сумму x из казначейства A в казначейство B, из банка в кассу или из paypal в мой банк, я добавляю два экземпляра в одну таблицу (treasuryitem), но с разными реквизитами (казначейство). в приведенном ниже коде у меня есть два экземпляра, но поле казначейство не сохраняется так, как я выбираю, оно сохраняет то же самое, например, казначейство A в обоих случаях. Кроме того, я хотел бы заполнить только первую форму и казначейство второй формы, а остальные поля второй формы должны сохраняться автоматически (имя=имя, дата=дата, дебет=кредит, кредит=дебет). Любой может помочь, пожалуйста. заранее спасибо

Модель :

 class Treasury(models.Model):  name = models.CharField(max_length=256)  class TreasuryItem(models.Model):  treasury = models.ForeignKey('Treasury', on_delete=models.CASCADE)  date = models.DateField(default=timezone.now)  name = models.CharField(max_length=256)  debit = models.DecimalField(max_digits=20, decimal_places=2, null=True, blank=True)  credit = models.DecimalField(max_digits=20, decimal_places=2, null=True, blank=True)  

форма :

 class TreasuryItem1Form(ModelForm):   class Meta:  model = TreasuryItem  fields = "__all__"   class TreasuryItem2Form(ModelForm):   class Meta:  model = TreasuryItem  fields = "__all__"  

Вид:

 def TreasuryItem_Create(request, pk):  treasurys = Treasury.objects.all()  treasury = treasurys.get(id=pk)  form1 = TreasuryItem1Form()  form2 = TreasuryItem2Form()  if request.method == 'POST':  form1 = TreasuryItem1Form(request.POST)  form2 = TreasuryItem2Form(request.POST)  if form1.is_valid() and form2.is_valid():  form1.save()  form2.save()  return redirect('treasury_profile', pk)  

Ответ №1:

Вам не нужны два экземпляра формы. Просто повторно сохраните экземпляр после наборов id как None , чтобы принудительно вставить новую вставку в базу данных.

  def TreasuryItem_Create(request, pk):  treasurys = Treasury.objects.all()  treasury = treasurys.get(id=pk)  form1 = TreasuryItem1Form()  if request.method == 'POST':  form1 = TreasuryItem1Form(request.POST)  if form1.is_valid() and form2.is_valid():  treasury_item = form1.save()  treasury_item.id = None  # modify any other field if need  # treasury_item.name = 'my new name`  treasury_item.save()  return redirect('treasury_profile', pk)  

Комментарии:

1. отличная работа, человек, пожалуйста, еще одна деталь, поле «дебет» первого экземпляра равно полю «кредит» второго экземпляра, пользователь заполнит только дебет, а остальное будет сделано автоматически; еще раз спасибо

2. @youssefmohamed, вы можете легко обновить поля второго экземпляра с помощью значений формы: treasury_item.credit = form1.cleaned_data.get('debit') и т. Д.