2016-10-22 45 views
0

我的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(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給空白表格?

回答

0

可能是因爲getattr(self, 'is_update_view', False)總是錯誤的,所以你沒有加載任何self.object

我對類似情況使用ModelFormSetViewdjango-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