-1

내가 self.kwargs.pop ('PK'를 사용하여 내 폼에 추가 매개 변수 ('PK')을 통과 할 때 내가 장고 1.9과 CreateView에 CBV를 사용하고 있습니다) 난 "키 오류"를 가지고 있지만, 나는 그것이 작동 인덱스 매개 변수를 얻는 경우에, 여기 내 코드입니다 :장고 KeyError를의 kwargs.pop ('PK')

def get_form(self, form_class=None, **kwargs): 
    self.project_version_pk = self.kwargs.pop('pk') 
    form = super(HRCreateView, self).get_form(form_class) 
    form.fields['project_version'].queryset = form.fields['project_version'].queryset.filter(pk=self.project_version_pk) 
    form.fields['project_version'].initial = self.project_version_pk 
    return form 

def get(self, request, *args, **kwargs): 
    self.object = None 
    form_class = self.get_form_class() 
    form = self.get_form(form_class, pk=self.kwargs['pk']) 

    return self.render_to_response(
     self.get_context_data(form=form) 

그리고이 오류가 얻을 :

builtins.KeyError KeyError를 'PK'

File "RelationView.py", line 65, in get_form 

self.project_version_pk = self.kwargs.pop('pk') 

KeyError: 'pk' 

하지만이 키를 읽으면 t 작동 : 매개 변수가 팝업에없는 이유를 정말 이해가 안

def get_form(self, form_class=None, **kwargs): 
    self.project_version_pk = self.kwargs['pk'] 
    form = super(HRCreateView, self).get_form(form_class) 
    form.fields['project_version'].queryset = form.fields['project_version'].queryset.filter(pk=self.project_version_pk) 
    form.fields['project_version'].initial = self.project_version_pk 
    return form 

() 또는이를위한 가장 좋은 방법이된다.

답변

1

첫째, 당신은 get을 무시해서는 안된다. CreateView에서 Django는 이미 get_form (get_context_data)을 호출합니다. 이것이 당신이 겪고있는 문제의 원인입니다. get_form으로 전화하고 더 이상 kwargs가되지 않도록 pk를 팝하십시오. 장고는 get_context_data에서 다시 이것을 호출하지만, 이번에는 처음으로 제거 했으므로 pk를 찾을 수 없습니다.

그래서 팝업을 사용하지 않는; 그러나 내가 말했듯이, 전혀 이것을하지 마십시오. 실제로 재정의해야하는 유일한 것은 get_form입니다.

+0

확인 응답에 대한 감사합니다,하지만 난 얻을 오버라이드 (override)하지 않는 경우, 나는'get_form' 방법 ''pk''을 통과 할 수있는 방법? –

+0

필요가 없습니다. 어쨌든이 메소드에 대한 인수를 사용하지 않고 있습니다. –

+0

나는 '이'형태 = self.get_form 불구하고 pk'' (form_class, PK = self.kwargs를'통과하고있어 ['PK ']없이 pk'')를'get' 방법'에, 형태는'얻을 수있는 방법' 다른 방법으로 통과시켜야합니까? 왜냐하면 나는 CreateView와 UpdateView를위한 동일한 폼을 가지고 있고''pk''' 만 CreateView를 전달해야하기 때문입니다. 죄송합니다, 아마도 이것은 모두 당신에게 분명합니다.하지만 장고는 불과 몇 달 전에 고맙습니다. –