2012-03-01 5 views
9

프로그래밍 방식으로 인라인 formset 통해 새 ForeignKey 개체를 게시하는 동안 오류 : ValueError: invalid literal for int() with base 10: '' 받고 있습니다. 여기에 역 추적이 출신단위 테스트 django 인라인 formsets

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') 

:

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') 

뷰 코드 (다시, 간결하게 정돈) : 여기

(여기서는 간결성을 위해 비 대한) 내 테스트의 코드입니다 테스트 실행 :

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: '' 

누구나 생각할 수있는 모델, 형식 등을 게시 할 수 있습니다. b 도움이됩니다.

문제는 'merit-0-id':u'' 항목에 있습니다. 나는 0 또는 -1을 사용하여 False을 사용하여 'new'을 사용하여 유니 코드를 사용하거나 사용하지 않고 시도했습니다 (완전한 와일드 샷).

내 주요 혼란은 서버를 실행할 때 양식이 작동한다는 것입니다. 양식을 제출할 때 POST 변수를 검사했으며 id 필드가 비어있을 수 있으며 항목이 정상적으로 추가되었습니다.

테스트 러너를 통해 제출할 때 양식이 왜 상각합니까?

답변

8

인라인 formset의 초기 양식은 DB의 기존 모델과 다시 묶일 필요가 있습니다. 설치가 관련 ChosenTrait 인스턴스를 만들지 않습니다 (merit-0-id에 사용해야하는 PK입니다). 모든 새 모델을 테스트하는 경우 'merit-INITIAL_FORMS'0이어야합니다.

+0

그게 다야! 고맙습니다! –

0

빈 필드는 빈 문자열이있는 필드와 같지 않습니다.

필드가 비어 있으면 브라우저에서이를 쿼리 문자열에 전혀 포함시키지 않습니다. 그러나 빈 문자열이 들어있는 필드를 사용하여 POST를 시뮬레이션 한 결과 물건이 혼란 스럽습니다. 해당 키를 dict에서 모두 제거하십시오.

+0

그래, 나는 그것에 대해 궁금해. 불행히도, 내가 그것을 제거하면, MultiValueDictKeyError를 얻습니다. 왜냐하면 dict에서 'merit-0-id'필드를 찾고 있기 때문입니다. –