2016-10-22 57 views
0

MY CreateViewは正常に機能しましたが、このフォームデータを更新しようとすると空白のフォームが表示されます。データは示されなかった。ここに私のviews.pyは以下のとおりです。ここでUpdateViewはdjangoインラインフォームセットで空白のフォームを返します

@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 

は私のフォームセットです:

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

マイフォームセットのミックスイン:

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が与える理由空白のフォーム?

答えて

0

おそらくgetattr(self, 'is_update_view', False)が常に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 
関連する問題