#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')
и т. Д.