4

初期データが提供されたフォームセットがあります。これは、「グループ」と「要求」の 2 つのフィールドを含む他のモデルから複製されたデータです。

初期データが提供されると、フォームセットのフォームは保存されず、フォームをデータで少し変更するときにのみ保存されます。

初期データが提供されない場合、フォームは保存されます。

フォームセットに初期データを追加すると、フォームセット データをデータベースに保存できなくなるのはなぜですか?

これは、get_context_data 辞書に存在する私のフォームセットです。

        initial = ProcedureActionGroup.objects.filter(procedure__id=self.kwargs.get('pk', None))
        initial_values = initial.values('group', 'requested')
        print initial_values
        initial_count = initial.count()

        ActionGroupFormset = inlineformset_factory(self.model, TaskGroup, extra=initial_count,
                                                   form=TaskActionGroupForm,
                                                   can_delete=False,
                                                   )
        data['formset'] = ActionGroupFormset(self.request.POST or None, initial=initial_values,
                                             **self.get_formset_kwargs())

これは、すべてのデータを保存する私の form_valid メソッドです

def form_valid(self, form):
    context = self.get_context_data()
    forms = []
    forms.append(form.is_valid())
    if self.get_procedure_obj():
        formset = context['formset']
        forms.append(formset.is_valid())

    if all(forms):
        self.object = form.save(commit=False)
        form.save()
        if self.get_procedure_obj():
            formset = formset.save(commit=False)
            for obj in formset:
                obj.task = self.object
                obj.save()

        self.object.extract_users()

        return HttpResponseRedirect(self.object.get_absolute_url())

モデル:

class TaskGroup(models.Model):
    task = models.ForeignKey(Task, null=True, blank=False)
    group = models.ForeignKey(ActionGroup, null=True, blank=True)
    requested = models.PositiveIntegerField(u'Requested', null=True, blank=True)

フォーム テンプレート:

<form method="post" action="" class="span6 offset2 form form-horizontal">
    {% crispy form%}
    {{formset.management_form}}
    {% if formset %}
    <div>
        <fieldset>
            <table class="table table-striped">
                {% for form in formset%}
                <tr>
                    {% for field in form %}
                     <td> {{field}} </td>
                    {% endfor %}
                </tr>
                {% endfor %}
            </table>
        </fieldset>
    </div>
    {% endif %}
    <div class="form-actions">
        <button class="btn btn-primary btn-large" type="submit">
            Save
        </button>
    </div>
</form>
4

2 に答える 2

5

django extra ビューを使用して同様の問題が発生しました。

inlineformset_factory に渡されるフォーム クラスを変更して解決しました。ModelForm.has_changed メソッドが false を返していました。

class TaskActionGroupForm(ModelForm):

    model = YourModel

    def has_changed(self):
        """
        Overriding this, as the initial data passed to the form does not get noticed, 
        and so does not get saved, unless it actually changes
        """
        changed_data = super(ModelForm, self).has_changed()
        return bool(self.initial or changed_data)
于 2014-04-01T15:12:41.490 に答える
1

上記の例では、initial に渡された値を既存のオブジェクトとして処理する inlineformset_factory を使用しました。

したがって、次のようにフォームセットをループしたとき:

for form in formset:
   form.has_changed()

form.has_changed() は False を返しました

inlineformset_factory を formset_factory に置き換えました。これにより、初期データが正しく保存される新しいデータとして扱われます。コード例は明日投稿します。

于 2013-08-21T17:03:44.813 に答える