2016-10-22 5 views
0

내 CreateView 잘 작동하지만이 양식 데이터를 업데이트하려고하면 빈 양식을 제공합니다. 데이터가 표시되지 않았습니다. 여기 내 views.py입니다 :UpdateView 장고 인라인 formset에 빈 양식을 제공합니다

class MemberForm(ModelForm): 

    class Meta: 
     model = Person 
     exclude = ('user',)  

    def __init__(self, *args, **kwargs): 
     super(MemberForm, self).__init__(*args, **kwargs) 

     self.fields['name'].widget.attrs['placeholder'] = 'Your full name' 
     self.fields['tele_land'].label = 'Land phone' 
     self.fields['tele_cell'].label = 'Cell phone' 
     self.fields['passing_year'].label = 'Passing year' 
     self.fields['passing_year'].help_text = 'According to your session year' 


    def save(self, request, commit=True): 
     person = super().save(commit=False) 
     if not person.pk: 
      person.user = get_user(request) 
     if commit: 
      person.save() 
      self.save_m2m() 
     return person 

class ChildrenForm(ModelForm): 
     class Meta: 
     model = Children 
     fields = '__all__' 

PersonFormSet = inlineformset_factory(Person, Children, extra=0, min_num=1, fields=('child_name', 'child_birth_date','blood_group')) 

URL :

url(r'^person/create/$', views.PersonCreate.as_view(), name='person-create'), 

url(r'^person/(?P<slug>[\w\-]+)/update/$', views.PersonUpdate.as_view(), name='person-update'), 

내 해당 formset 믹스 인이 :

class FormsetMixin(object): 
    object = None 

    def get(self, request, *args, **kwargs): 
     if getattr(self, 'is_update_view', False): 
      self.object = self.get_object() 
     form_class = self.get_form_class() 
     form = self.get_form(form_class) 
     formset_class = self.get_formset_class() 
     formset = self.get_formset(formset_class) 
     return self.render_to_response(self.get_context_data(form=form, formset=formset)) 

    def post(self, request, *args, **kwargs): 
     if getattr(self, 'is_update_view', False): 
      self.object = self.get_object() 
     form_class = self.get_form_class() 
     form = self.get_form(form_class) 
     formset_class = self.get_formset_class() 
     formset = self.get_formset(formset_class) 
     if form.is_valid() and formset.is_valid(): 
      return self.form_valid(form, formset) 
     else: 
      return self.form_invalid(form, formset) 

    def get_formset_class(self): 
     return self.formset_class 

    def get_formset(self, formset_class): 
     return formset_class(**self.get_formset_kwargs()) 

    def get_formset_kwargs(self): 
     kwargs = { 
      'instance': self.object 
     } 
     if self.request.method in ('POST', 'PUT'): 
      kwargs.update({ 
       'data': self.request.POST, 
       'files': self.request.FILES, 
      }) 
     return kwargs 

    def form_valid(self, form, formset): 
     self.object = form.save(self.request) 
     formset.instance = self.object 
     formset.save() 
     return redirect(self.object.get_absolute_url()) 

    def form_invalid(self, form, formset): 
     return self.render_to_response(self.get_context_data(form=form, formset=formset)) 

내 UpdateView주는 이유는 여기에

@require_authenticated_permission(
'member.add_person') 
class PersonCreate(FormsetMixin, CreateView): 
    template_name = 'member/person_form.html' 
    model = Person  
    form_class = MemberForm 
    formset_class = PersonFormSet 

@require_authenticated_permission(
'member.change_person') 
class PersonUpdate(FormsetMixin, UpdateView): 
    template_name = 'member/person_form.html' 
    model = Person  
    form_class = MemberForm 
    formset_class = PersonFormSet 

내 해당 formset입니다 빈칸?

답변

0

getattr(self, 'is_update_view', False)이 항상 거짓이므로 self.object을로드하지 않기 때문일 수 있습니다.

나는 유사한 상황에 대해 ModelFormSetView에서 django-extra-views을 사용했습니다. Django 클래스 기반의 뷰를 이미 이해하고 자신을 작성하고 유지 관리 할 수있는 많은 코드를 저장하면 쉽게 사용할 수 있습니다.

현재 get_queryset을 구현하고 Children을 프리 페치해야합니다.

0

UpdateView에서 사용 : is_update_view = True. 그것은 같을 것이다

class PersonUpdate(FormsetMixin, UpdateView): 
template_name = 'member/person_form.html' 
model = Person  
is_update_view = True 
form_class = MemberForm 
formset_class = PersonFormSet 
관련 문제