2012-03-01 34 views
9

Khi cố gắng lập trình đăng đối tượng ForeignKey mới thông qua một bộ định dạng nội tuyến, tôi nhận được một lỗi: ValueError: invalid literal for int() with base 10: ''.Đơn vị thử nghiệm các biểu mẫu nội tuyến django

Dưới đây là đoạn code của thử nghiệm của tôi (cồng kềnh vì lợi ích của ngắn gọn ở đây):

def test_merits_can_be_added(self): 
    self.c = Client() 
    self.c.login(username=self.user.username, password='dummy') 
    self.post_data = { 
     'name':u'Unhappy SE', 
     'concept':u'Sad clown', 
     'merit-TOTAL_FORMS':u'1', 
     'merit-MAX_NUM_FORMS':u'', 
     'merit-INITIAL_FORMS':u'1', 
     'merit-0-id':u'', 
     'merit-0-level':u'2', 
     'merit-0-character':u'1', 
     'merit-0-trait':u'11', 
     'merit-0-specializations':u'Sometimes' 
    } 
    sheet = GeistCharacterSheet.objects.create(name='Happy SE', user=self.user) 
    response = self.c.post(sheet.get_absolute_url(), self.post_data, follow=True) 
    self.assertEqual(GeistCharacterSheet.objects.get(pk=1).chosentrait_set.all().filter(trait__name='Common Sense')[0].level, 2) 
    self.assertEqual(GeistCharacterSheet.objects.get(pk=1).chosentrait_set.all().filter(trait__name='Common Sense')[0].specializations, u'Sometimes') 

Mã view (một lần nữa, tỉa cho ngắn gọn):

def character_sheet(request, sheet_id=None): 
    charsheet = GeistCharacterSheet.objects.get(pk=sheet_id, user=request.user) 
    if request.method == 'POST': 
    sheet_form = GeistCharacterSheetForm(request.POST, instance=charsheet)   
    merit_formset = setup_merit_form(charsheet, post=request.POST) 

    if sheet_form.is_valid() and merit_formset.is_valid(): 
     sheet_form.save() 
     merit_formset.save() 
     return redirect('/character-manager/list/') 

def setup_merit_form(charsheet, post=None): 
    MeritFormSet = inlineformset_factory(GeistCharacterSheet, ChosenTrait, form=ChosenMeritForm, extra=1) 
    if post: 
    return MeritFormSet(post, instance=charsheet, queryset=ChosenTrait.objects.filter(trait__trait_type__name='Merit'), prefix='merit') 
    else: 
    return MeritFormSet(instance=charsheet, queryset=ChosenTrait.objects.filter(trait__trait_type__name='Merit'), prefix='merit') 

Đây là traceback từ thử nghiệm thực hiện:

Traceback (most recent call last): 
    File "C:\charon_sheet\..\charon_sheet\character_manager\tests.py", line 119, in test_skills_can_be_changed 
    response = self.c.post(sheet.get_absolute_url(), self.post_data, follow=True) 
    File "C:\Program Files\BitNami DjangoStack\apps\django\django\test\client.py", line 449, in post 
    response = super(Client, self).post(path, data=data, content_type=content_type, **extra) 
    File "C:\Program Files\BitNami DjangoStack\apps\django\django\test\client.py", line 259, in post 
    return self.request(**r) 
    File "C:\Program Files\BitNami DjangoStack\apps\django\django\core\handlers\base.py", line 111, in get_response 
    response = callback(request, *callback_args, **callback_kwargs) 
    File "C:\charon_sheet\..\charon_sheet\character_manager\views.py", line 29, in character_sheet 
    merit_formset = setup_merit_form(charsheet, post=request.POST) 
    File "C:\charon_sheet\..\charon_sheet\character_manager\views.py", line 69, in setup_merit_form 
    return MeritFormSet(post, instance=charsheet, queryset=ChosenTrait.objects.filter(trait__trait_type__name='Merit'), prefix='merit') 
    File "C:\Program Files\BitNami DjangoStack\apps\django\django\forms\models.py", line 682, in __init__ 
    queryset=qs) 
    File "C:\Program Files\BitNami DjangoStack\apps\django\django\forms\models.py", line 415, in __init__ 
    super(BaseModelFormSet, self).__init__(**defaults) 
    File "C:\Program Files\BitNami DjangoStack\apps\django\django\forms\formsets.py", line 47, in __init__ 
    self._construct_forms() 
    File "C:\Program Files\BitNami DjangoStack\apps\django\django\forms\formsets.py", line 108, in _construct_forms 
    self.forms.append(self._construct_form(i)) 
    File "C:\Program Files\BitNami DjangoStack\apps\django\django\forms\models.py", line 691, in _construct_form 
    form = super(BaseInlineFormSet, self)._construct_form(i, **kwargs) 
    File "C:\Program Files\BitNami DjangoStack\apps\django\django\forms\models.py", line 437, in _construct_form 
    connection=connections[self.get_queryset().db]) 
    File "C:\Program Files\BitNami DjangoStack\apps\django\django\db\models\fields\subclassing.py", line 53, in inner 
    return func(*args, **kwargs) 
    File "C:\Program Files\BitNami DjangoStack\apps\django\django\db\models\fields\subclassing.py", line 53, in inner 
    return func(*args, **kwargs) 
    File "C:\Program Files\BitNami DjangoStack\apps\django\django\db\models\fields\__init__.py", line 306, in get_db_prep_lookup 
    value = self.get_prep_lookup(lookup_type, value) 
    File "C:\Program Files\BitNami DjangoStack\apps\django\django\db\models\fields\__init__.py", line 292, in get_prep_lookup 
    return self.get_prep_value(value) 
    File "C:\Program Files\BitNami DjangoStack\apps\django\django\db\models\fields\__init__.py", line 479, in get_prep_value 
    return int(value) 
ValueError: invalid literal for int() with base 10: '' 

Tôi có thể đăng mô hình, biểu mẫu, nhiều chế độ xem, bất kỳ ai cũng nghĩ rằng b e hữu ích.

Sự cố xảy ra với mục bài đăng 'merit-0-id':u''. Tôi đã thử có và không có unicode, sử dụng 0 hoặc -1, sử dụng False, sử dụng 'new' (một ảnh hoàn toàn hoang dã, tôi biết).

Sự nhầm lẫn chính của tôi đến ở chỗ biểu mẫu hoạt động khi tôi đang chạy máy chủ. Tôi đã kiểm tra các biến POST khi tôi gửi biểu mẫu và trường id đó có thể trống và mục được thêm vào chỉ là tốt.

Tại sao biểu mẫu bị chặn lại khi được gửi qua thử nghiệm?

Trả lời

8

Biểu mẫu ban đầu trong biểu mẫu nội tuyến cần phải liên kết ngược với các mô hình hiện có trong DB. Thiết lập của bạn không tạo ra phiên bản ChosenTrait liên quan (đây là trường hợp bạn nên sử dụng cho merit-0-id). Nếu bạn đang thử nghiệm tạo tất cả các mô hình mới thì 'merit-INITIAL_FORMS' phải là 0.

+0

Đó là nó! Cảm ơn bạn! –

0

Trường trống không giống với trường có chuỗi trống.

Nếu một trường trống, trình duyệt sẽ không bao gồm trường đó trong chuỗi truy vấn. Tuy nhiên, bạn đã mô phỏng một POST với trường đó chứa một chuỗi rỗng, điều này làm lẫn lộn mọi thứ. Loại bỏ khóa đó hoàn toàn khỏi dict.

+0

Yup, tôi tự hỏi về điều đó. Thật không may, nếu tôi gỡ bỏ nó, tôi nhận được một MultiValueDictKeyError, bởi vì nó đang tìm kiếm trường 'merit-0-id' trong dict. –

Các vấn đề liên quan