簡體   English   中英

如何測試內嵌表單集

[英]how to test inline formset

有一個內聯表單集可以很好地工作。 它僅在測試中失敗。

有一個模型將兩種類型的參與者聯系在一起:發送者和接收者。

models.py

class SendReceive(models.Model):
   receiver =jmodels.ForeignKey(Player, related_name='receiver')
   sender = models.ForeignKey(Player, related_name='sender')
   amount_requested = models.IntegerField()
   amount_sent = models.IntegerField(blank=True)

向發件人顯示了一個內聯表單集,發件人選擇了發送給收件人的數量:

forms.py

class SRForm(forms.ModelForm):
    class Meta:
        model = SendReceive
        fields = ['amount_sent']

SRFormSet = inlineformset_factory(Player, SendReceive,
                                  fk_name='sender',
                                  can_delete=False,
                                  extra=0,
                                  form=SRForm,
                                  )

views.py (CBV)

def post(self):
    context = super().get_context_data()
    formset = SRFormSet(self.request.POST, instance=self.player)
    context['formset'] = formset
    if not formset.is_valid():
        return self.render_to_response(context)
    formset.save()
    return super().post()

因此,當我嘗試對其進行測試時, formset.save()會導致錯誤:

 django.db.utils.IntegrityError: NOT NULL constraint failed: 
 riskpooling_sendreceive.receiver_id

由於未設置接收者ID。 雖然,如果我查看返回的formset.forms的內容,則所有內容都在其中。 同樣,在現實生活中,一切正常,並且可以正確保存。 因此,只有測試會導致錯誤。 我做錯了什么?

更新:

我不知道這是否重要,但是我是否將self.request.POST的輸出以正常流程(未經測試)和測試(以錯誤結束的方式)進行比較:

經過測試:

   <QueryDict: {'sender-0-sender': ['1'], 
   'sender-0-amount_sent': ['6'], 'sender-0-id': ['2'],
    'sender-INITIAL_FORMS': ['1'], 'sender-TOTAL_FORMS': ['1']}>

沒有測試:

  <QueryDict: {'origin_url': [''], 'sender-INITIAL_FORMS': ['1', '1'], 
  'sender-MAX_NUM_FORMS': ['1000', '1000'], 'csrfmiddlewaretoken': 
   ['KdpMPEJMOR4yHTMyO6KrS1bJE3eMfPBa'], 'sender-0-amount_sent': ['1'], 
   'sender-0-id': ['1'], 'sender-MIN_NUM_FORMS': ['0', '0'],
   'sender-0-sender': ['62'], 'sender-TOTAL_FORMS': ['1', '1']}>

因此,除了csrf令牌的明顯區別之外,所有內容看起來都是相同的。

我發現了原因。

簡而言之,當您傳遞FORMSET_NAME-0-id您需要在其中傳遞實際記錄的pk (如果您不想創建新記錄)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM