2013-06-04 2 views
3

하나의보기/템플릿에서 두 모델 양식의 사용 예를 보여줄 수 있습니까? 작업은 하나의 CBV에서 둘 이상의 양식을 처리하는 것입니다. 여기서 두 번째 양식의 모델에는 FK가 처음으로 양식이 있으므로 첫 번째 양식의 선택 위젯의 값을 두 번째 양식으로 작성된 개체의 값으로 처리해야합니다. 난 단지 사후에 처리를 작성해야 뷰에서 다음CBV를 사용하여 Django에서 하나의보기/템플릿으로 구성된 두 개의 모델 양식

class MultiFormCreate(FormMixin, TemplateResponseMixin, View): 
    formconf = None 

    def get_form_classes(self): 
     form_classes = {} 
     for key, params in self.formconf.items(): 
      form_classes[key] = params.formclass 
     return self.form_classes 

    def get_initial(self, classname): 
     inicial = {} 
     if 'inicial' in self.formconf[classname]: 
      inicial = self.formconf[classname]['inicial'].copy() 
     return inicial 

    def get_form_kwargs(self, classname): 
     kwargs = {'initial': self.get_initial(classname), 'prefix': classname} 
     if self.request.method in ('POST', 'PUT'): 
      kwargs.update({ 
       'data': self.request.POST, 
       'files': self.request.FILES, 
       }) 
     return kwargs 

    def get_forms(self): 
     for classname, params in self.formconf.items(): 
      log.info("Name: %s, Params: %s" % (classname, params)) 
     return dict(
      [(classname, params['formclass'](**self.get_form_kwargs(classname))) for classname, params in self.formconf.items()]) 

    def get(self, request, *args, **kwargs): 
     forms = self.get_forms() 
     return self.render_to_response(self.get_context_data(forms=forms)) 

    def get_success_url(self): 
     if self.success_url: 
      url = force_text(self.success_url) 
     else: 
      raise ImproperlyConfigured(
       "No URL to redirect to. Provide a success_url.") 
     return url 

: :이 믹스 인을 썼다

class CompanyEditForm(ModelForm): 
    name = CharField(label="Наименование", required=True) 
    type = ModelChoiceField(queryset=CompanyTypes.objects.all(), label="Тип компании", empty_label=None, initial=3) 
    description = CharField(label="Описание компании", required=False, widget=forms.Textarea(attrs={'cols': 40, 'rows':3})) 
    www = CharField(label="WEB сайт", required=False) 

    class Meta: 
     model = Companies 
     fields = ('type', 'name', 'description', 'www') 


class BranchEditForm(ModelForm): 
    name = CharField(label="Наименование офиса", required=True) 
    type = ModelChoiceField(queryset=BranchTypes.objects.all(), label="Тип отделения", empty_label=None, initial=1) 

    class Meta: 
     model = Branches 
     exclude = ('company', 'address') 


class AddressEditForm(ModelForm): 
    postalcode = IntegerField(label="Почтовый код", required=False) 
    city = CharField(label="Город", required=True) 
    street = CharField(label="Улица", required=True) 
    app = CharField(label="Дом", required=True) 
    app_extra = CharField(label="Корпус/Строение", required=False) 
    comment = CharField(label="Примечание к адресу", required=False) 
    exclude = ('company',) 

    class Meta: 
     model = Addresses 
     fields = ('postalcode', 'city', 'street', 'app', 'app_extra', 'comment') 

UPDATE :

내 형태

은 다음과 같습니다

class CompanyCreate(MultiFormCreate): 
    template_name = 'company/edit.html' 
    success_url = '/forbidden/' 
    formconf = { 
     'company': {'formclass': CompanyEditForm, 'inicial': {'name': "TESTNAME"}}, 
     'branch': {'formclass': BranchEditForm}, 
     'address': {'formclass': AddressEditForm} 
    } 

    def post(self, request, *args, **kwargs): 
     forms = self.get_forms() 
     cform = forms['company'] 
     aform = forms['address'] 
     bform = forms['branch'] 
     if cform.is_valid() and aform.is_valid() and bform.is_valid(): 
      ''' Creating main form form object (by saving tthe form) ''' 
      company_object = cform.save() 
      ''' Creating dependant object ''' 
      address_object = aform.save(commit=False) 
      branch_object = bform.save(commit=False) 
      ''' assigning dependent fields ''' 
      address_object.company = company_object 
      ''' saving dependent _object_ ''' 
      address_object.save() 
      ''' managing another dependent fields ''' 
      branch_object.company = company_object 
      branch_object.address = address_object 
      ''' saving last object ''' 
      branch_object.save() 
      return HttpResponseRedirect(self.get_success_url()) 
     else: 
      forms = self.get_forms() 
      return self.render_to_response(self.get_context_data(forms=forms)) 
보기 파일
+0

당신은 우리가 그것의 객체로 전달해야하는 기업 목적에 지점 형태 (BranchEditForm)을 저장하려고합니까? –

+0

그래! CompanyForm에서 생성 된 개체의 CompnayID는 BranchEditForm의 결과를 '회사'로, '만들기'보기로, '편집'보기로 저장해야합니다. –

답변

1

코드 :

if request.method == "POST": 
     company_form = CompanyEditForm(request.POST) 
     if company_form.is_valid(): 
      company_object = company_form.save() 
      post_data = request.POST.copy() 
      branch_form = BranchEditForm(post_data) 
      branch_form.data['company'] = company_object 
      if branch_form.is_valid(): 
       branch_object.save() 

나머지는 비즈니스 로직을 구현에 ..

관련 문제