Как отправить форму обновления и форму создания одновременно в Django?

Я пытаюсь обновить модель "Stock", а затем создать новую "StockTransaction" в то же время. Я хочу выполнить это с помощью двух разных форм, представленных вместе. Мне удается заставить работать транзакцию обновления запасов, но когда я пытаюсь выполнить is_valid() на форме транзакции, она всегда возвращает false. Я не могу понять, почему она возвращает false.

здесь приведены все соответствующие участки кода, которые используются. Любая помощь будет принята с благодарностью. Заранее спасибо!

def buyStock(request, pk):
    stock = Stock.objects.get(id=pk)
    form = StockForm(instance=stock)
    tform = StockTransForm()
    if request.method == 'POST':
        form = StockForm(request.POST, instance=stock)
        form.instance.buyPrice = stock.ticker.price
        form.instance.dateOfPurchase = date.today()
        form.instance.forSale = False

        tform.instance.stockID = stock.stockID
        tform.instance.buyPrice = stock.buyPrice
        tform.instance.sellPrice = stock.ticker.price
        tform.instance.broker = form.instance.broker
        tform.instance.buyer = form.instance.ownerID
        tform.instance.seller = stock.ownerID
        tform.instance.ticker = stock.ticker

    if form.is_valid() and tform.is_valid():
            form.save()
            tform.save()
class StockTransaction(models.Model):
    transactionID = models.AutoField(primary_key=True)
    ticker = models.ForeignKey(PublicCompany, on_delete=models.CASCADE, default=None,
                               related_name='stocktrans-ticker+')
    stockID = models.IntegerField()
    buyer = models.ForeignKey(FinancialAccount, on_delete=models.PROTECT, default=None,
                              related_name='stocktrans-buyer+')
    seller = models.ForeignKey(FinancialAccount, on_delete=models.PROTECT, default=None,
                               related_name='stocktrans-seller+')
    sellPrice = models.DecimalField(max_digits=7, decimal_places=2)
    buyPrice = models.DecimalField(max_digits=7, decimal_places=2)
    date = models.DateField(auto_now_add=True)
    broker = models.ForeignKey(Agent, on_delete=models.PROTECT, default=None, related_name='stocktrans-broker+')
class Stock(models.Model):

    ownerID = models.ForeignKey(FinancialAccount, on_delete=models.CASCADE, default=None,
                                related_name='stock-owner+')#on delete maybe change
    buyPrice = models.DecimalField(max_digits=7, decimal_places=2)
    broker = models.ForeignKey(Agent, on_delete=models.PROTECT, default=None, related_name='stock-broker+')
    dateOfPurchase = models.DateField(auto_now_add=True)
    ticker = models.ForeignKey(PublicCompany, on_delete=models.CASCADE, default=None)
    stockID = models.IntegerField()
    forSale = models.BooleanField(default=True)

    class Meta:
        unique_together = ['ticker', 'stockID']
class StockTransForm(ModelForm):
    class Meta:
        model = StockTransaction
        fields = []
{% extends 'finances/base.html' %}
{% block content %}
    <div class="content-section">
        <form action="" method="POST">
            {% csrf_token %}
            {{form}}
            <fieldset class="form-group">
                <legend class="border-bottom mb-4">Buy Asset</legend>
                <h2>Are you sure you want to buy this asset - {{stock.ticker}}:{{stock.stockID}}</h2>
            </fieldset>
            <div class ="form-group">
                <button class="btn btn-outline-danger" type ="submit">Buy</button>
                <a class="btn btn-outline-secondary" href="{% url 'finance-forsale'%}">No</a>
            </div>
        </form>
    </div>
{% endblock content %}

Я просмотрел каждую переменную, чтобы убедиться, что все они совпадают и являются одинаковыми.

Не знаю, что не так, но обновление экземпляра не является официальным способом. Вы должны использовать commit=False для применения всех данных, поступивших через форму, чтобы получить экземпляр, который еще не сохранен.

 if request.method == 'POST':
     form = StockForm(request.POST, instance=stock)
     if form.is_valid():
         f_instance = form.save( commit=False)
         # now update instance with non-form data
         f_instance.buyPrice = stock.ticker.price
         f_instance.dateOfPurchase = date.today()
         f_instance.forSale = False
         # f_instance is not yet saved to the DB
     
     #now similar code for tform to t_instance
     ...

     # finally, save these instances to the DB
     if form.is_valid() and tform.is_valid():
         with transaction.atomic():   # unless the entire view is atomic
              f_instance.save()
              t_instance.save() 
         

     
         
         
Вернуться на верх