2017-10-04 60 views
0

有一個內聯formset可以很好地工作。它只在測試中失敗。如何測試內聯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的內容,所有內容都在那裏。再一次,在現實生活中一切都很好,並得到妥善保存。所以只有測試結果出錯。我做錯了什麼?

UPDATE:

我不知道這是否重要與否,但如果我比較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標記的明顯區別之外,一切看起來都是一樣的。

+0

在你的表格中唯一的字段是amount_sent。所以當你創建新的對象時,你不是從接收者的模板發送。這就是錯誤的原因。 –

+0

是的,你是對的,但表單更新記錄,它不會創建一個。所以那個時候接收機已經設置好了。 –

+0

hm。如何隱藏該字段並添加到字段中? –

回答

0

我發現是什麼原因。

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

相關問題