繁体   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