[英]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.