Как получить данные первой формы и установить эти данные во второй форме? - PullRequest
0 голосов
/ 03 апреля 2020

У меня есть модели Offer & OfferItem, как показано ниже, и мне нужно создать Offer и OfferItem на той же странице шаблона. Моя проблема в том, что я хочу сначала сохранить offer_form, затем установить сохраненную запись предложения как связанную с полем itemOffer, а затем сохранить offeritem_form, как я могу это сделать? Или может быть мои модели и логика c совершенно неверны, если так, то есть ли другой способ сделать это?

* Я исключаю HStoreField , потому что мне нужно будет сохранить несколько OfferItem s на одной странице (может быть, я снова ошибаюсь, я не знаю)

Вот мои модели et c.

Модели;

class Offer(models.Model):

    offerCreate = models.DateTimeField(auto_now=False, auto_now_add=True)
    offerOwner = models.ForeignKey(User, on_delete=models.CASCADE)
    offerNumber = models.CharField(max_length = 150)
    offerCondi = models.TextField()
    offerTotal = models.FloatField()

    def __str__(self):
        return self.offerNumber

    class Meta:
        verbose_name = 'Offer'
        verbose_name_plural = 'Offers'

class OfferItem(models.Model):

    itemOffer = models.ForeignKey('sales.Offer', on_delete=models.CASCADE)
    itemName = models.CharField(max_length = 150,null=True)
    itemProduct = models.ForeignKey('products.Product', on_delete=models.CASCADE)
    itemLeadtime = models.CharField(max_length = 150)
    itemCost = models.FloatField()
    itemPrice = models.FloatField()
    itemCurrency = models.ForeignKey('products.Currency', on_delete=models.CASCADE)
    itemQuantity = models.IntegerField()
    itemOfferprice = models.FloatField()    

    def __str__(self):
        return self.itemName

    class Meta:

        verbose_name = 'OfferItem'
        verbose_name_plural = 'OfferItems'

Просмотр;

def createofferView(request):
    offer_form = CreateOfferForm(request.POST or None)
    offeritem_form = CreateOfferItemForm(request.POST or None)
    if offer_form.is_valid() and offeritem_form.is_valid():
        offer_form.save()
        offeritem_form.save()
        messages.success(request, 'Success!')
        return redirect('offers')

    return render(request, 'sales/createoffer.html',{'offer_form':offer_form,'offeritem_form':offeritem_form})

1 Ответ

0 голосов
/ 06 апреля 2020

Метод ModelForm.save() возвращает экземпляр, который был сохранен. Кроме того, вы можете save(commit=False) создать экземпляр без фиксации (сохранения) его в базе данных. Это позволяет вам сделать следующее:

offer = offer_form.save()
item = offeritem_form.save(commit=False)  # we don't commit yet, because we need to assign the offer first
item.itemOffer = offer
item.save()

Это в основном то, что django документы говорят вам о ModelForm.save(). Вы должны как можно больше использовать документы, они содержат множество примеров, которые отвечают на большинство ваших вопросов.

Примечание. В python рекомендуется стараться быть как можно более кратким (но также как можно более ясно). Ваш код должен читаться как предложения Engli sh. item.itemOffer = offer не хорошо Engli sh. item.offer = offer имеет больше смысла грамматически. Назовите свои поля соответственно, не ставьте перед ними все префиксы item или offer, так как они уже используются в контексте OfferItem из Offer в любом случае.

...