2013-04-11 4 views
1

나는 내가 원하는 것에 대한 최선의 접근법을 찾고 있습니다. 그리고 나는 그것을 위해 약간의 도움을 사용할 수 있습니다.Django : formset의 양식마다 다른 양식 필드 위젯

나는 당신이 동일한 페이지에 하나의 모델 A와 몇 가지 모델 모두 B 년대를 편집 할 수있는 뷰를 생성 할 모델 A와 모델 B를 모델 B는

modela = forms.ForeignKey(Model a) 

을 가지고 있습니다. 장고는 이것에 대한 포맷을 가지고 있으며 훌륭하게 작동합니다.

나는 하나의 세부 사항을 가지고 있지만, 사물을 조금 뒤죽박죽입니다. 즉 - 나는 위젯이나 모델 B 필드가 같은 객체의 이전 필드에서 어떤 선택을했는지에 따라 달라지기를 원합니다. 왜냐하면 - 유형에 따라 위젯은 날짜/시간 선택기 입력 또는 일반 텍스트 입력이어야합니다.

모델 B는 다음과 같습니다

class ModelB(models.Model): 
    m0odela = models.ForeignKey(ModelA) 
    target_value = models.CharField() 
    target_type = models.CharField(choices = (there are choices)) 
    target_threshold = models.CharField() 

내가 해당 formset에 대한 내 자신의 양식을 제공 할 수 있습니다 그리고 난 그 형태이 위젯 할당을 할 수있는 알고있다.

하지만 문제는 formset에 인스턴스/쿼리 세트가없는 경우 'target_type'이 forms 인스턴스로 설정되었는지 확인하지 못할 때입니다. 그래서 self.data 또는 self.initial 형식을 기반으로해야 할 것입니다. 그러나 self.initial도 form.__init__()에 없습니다. 내가 할 수있는 일은 self.data이다 -하지만 원시 요청이다. POST 나 request.GET 데이터 - 'mymodelb_set-0-target_type'과 같은 모든 키를 포함하고있다.

그래서 여기에 약간의 손실이 있습니다. 일부 핵심 구문 분석을 수행하고 어떤 -target_type이 현재 양식에 속하고 선택한 값을 가져오고이 값을 기반으로 위젯을 할당해야하는지 파악해야합니까? 또는 BaseInlineFormSet의 자체 하위 클래스를 만들고 거기에 _construc_form을 재정의해야합니까? 그 양식은 ** kwargs의 관련 데이터로 초기 키를 갖습니다.

이전에 이런 종류의 문제가 발생 했습니까?

알란

답변

1

글쎄, 나는 그것을 해결해야만 했으므로 좋았어.

class MyInlineFormSet(BaseInlineFormSet): 
    def _construct_form(self, i, **kwargs): 
     initial = {} 
     fname = '%s-%s-%s' % (self.prefix, i, 'important_field_name') 
     initial['target_type'] = self.data[fname] if fname in self.data.keys() else 'km' 
     kwargs.update({'initial':initial}) 
     form = super(MyInlineFormSet, self)._construct_form(i, **kwargs) 
     return form 

다음 폼 클래스 :보기

class MyNiftyForm(forms.ModelForm): 
    class Meta: 
     model = MyAwesomeObject 
     fields=('field_one', 'field_two', 'field_three') 

    def __init__(self, *args, **kwargs): 
     super(ServiceTargetForm, self).__init__(*args, **kwargs) 
     if self.instance: 
      if self.instance.field_one == 'date': 
       self.fields['field_one'].widget.attrs['class'] = 'datepicker' 
     if self.initial: 
      if self.initial['field_one'] == 'date': 
       self.fields['field_one'].widget.attrs['class'] = 'datepicker' 

다음 :

나는 인라인의 formset 내 자신의 서브 클래스 생성

MySuperCoolFormSet = inlineformset_factory(ImportantObject, MyAwesomeObject, extra = 1, form = MyNiftyForm, formset = MyInlineFormSet) 

을 그리고 그것은 작동합니다.

앨런

관련 문제