2016-06-13 5 views
0

私はDjangoのModel Formsetを使用して、さまざまなデータのフォームセットを生成しています。素晴らしいことですが、ユーザーがフォームセットを表示して10個のアイテムのうち2個を更新すると、2個のアイテムだけを追跡して「2個のアイテムを更新しました" ものの種類。Django Model Formset:セットに更新/保存されたアイテムの変更のみを追跡しますか?

Django Model Formsetsには、このためのAPIが組み込まれていますか?私はDjango Docsでそれを見つけることができません。

私は様々なアプローチを試みたが、以下のピーターによって提供されるコードを使用する場合、これを取得しておくました:)私は(formset.has_changedにform.has_changed切り替えると

'Attendance' object has no attribute 'has_changed.' 

を、私は

'list' object has no attribute 'has_changed' 
を取得

私の見るとPostメソッド

class AttendanceView(TemplateView): 

    template_name = 'example.html' 

    def changed_forms(self, formset): 
     return sum(1 for form in formset if form.has_changed()) 

def post(self, request, *args, **kwargs): 
    formset = AttendanceFormSet(request.POST) 
    if formset.is_valid(): 
     formset = formset.save() 
     forms_changed = self.changed_forms(formset) 
     context = self.get_context_data(**kwargs) 
     context['total_changed_forms'] = forms_changed 
     return self.render_to_response(context) 
    else: 
     return HttpResponse("POST failed") 

は、だから、僕は変化し、それを考え出した:

formset = formset.save() 

formset.save() 

答えて

2

フォームセットは、そのフォームのいずれかが変更されたかどうかを報告しますhas_changed方法があります。それはあなたが探しているものではありませんが、実装を見ると、その方法を示す必要があります。その方法は次のとおりです。

def has_changed(self): 
    """ 
    Returns true if data in any form differs from initial. 
    """ 
    return any(form.has_changed() for form in self) 

だから、あなたが変更フォームを数えることができます。

def changed_forms(formset): 
    return sum(1 for form in formset if form.has_changed()) 

それとも、ブール値の整数の意味使用して快適にしている場合:

return sum(form.has_changed() for form in formset) 

を私は個人的に見つけますそれはより明示的なマッピングと比較して魅力的ではありません。trueから1に意見があります。

+0

ありがとう@peter DeGlopper ...どうすればそのデータをテンプレートのコンテキストに追加できますか?テンプレートにそのデータを出力したいのですか? –

+0

一般にコンテキストにデータを追加することに慣れていますか?これはそれほど違いはありません。明らかに、フォームセットを 'POST'データにバインドした後にのみ可能です。 –

+0

ちょっとピーター、私は間違いを続けています。上記のコード例を更新しました。私のフォームがhas_changed()メソッドをピックアップしているようには見えません... –

関連する問題