0

既存の行を更新するのではなく、新しい行を挿入する Django コードに問題があります。instanceここにいる多くの人が同様の問題について助けを求めてきましたが、通常は のように設定することを忘れていますform = SomeModelForm(request.POST or None, instance=some_model_instance)。私はそれを正しくやっているようですが、それでも既存のデータを保存しません。

もう1人のポスターにはまったく同じ問題がありました(UPDATE にしたい場合は Django form INSERTsを参照してください)。問題を解決するために彼に与えられたコードが問題を解決したようですが、彼が尋ねたときになぜそれが機能したのか誰も説明しませんでした!

見る

   if form_type == "edit_event":
        # we need to load all the data based on the event_id
        event_id = request.POST['event_id'] or None
        event_to_edit = mapDataManager.getEvent(event_id)
        if event_to_edit and mapDataManager.userCreatedEvent(request.user, event_to_edit):
            # this user actually created this event
            # let them edit it
            event_form = EventModelForm(request.POST or None, instance=event_to_edit)
            location_form = LocationModelForm(request.POST or None, instance=event_to_edit.location)
            list_of_event_scheds = EventSchedule.objects.filter(pk=event_id).values()
            event_sched_formset = EventScheduleModelFormSet(request.POST or None, initial=list_of_event_scheds)

            if event_form and location_form and event_sched_formset:
                if event_form.is_valid() and location_form.is_valid() and event_sched_formset.is_valid():
                    # update event
                    mapDataManager.updateEvent(event_form, location_form, event_sched_formset)
                    # redirect
                    return HttpResponseRedirect(reverse('map'))
                else:
                    # set feedback to show edit event form
                    feedback = "edit_event"

updateEvent()

def updateEvent(self, event_form, location_form, event_sched_forms):

    event = event_form.save(commit=False)
    location = location_form.save()
    event.location = location
    event.save()
    for event_sched_form in event_sched_forms: # loop through formset
        event_sched = event_sched_form.save(commit=False)
        event_sched.event = event
        event_sched.save()

誰でも私を助けることができますか?本当に基本的なものが欠けていますか?

編集:明確にするために、私のフォームはどれも更新されておらず、すべてが挿入されていました。ダニエルの提案に基づいて、フォームセットを使用して、編集中の 3 つのモデルフォームすべてをリンクする必要があると思います。

4

3 に答える 3

1

何らかの奇妙な理由でinstance、メイン フォームに正しく渡されていますinitialが、問題の直接の原因である EventScheduleModelFormSet に渡されています。

ただし、これらのモデルには明らかに外部キー関係があるため、インライン モデル フォームセットを使用する必要があるように思われます。

from django.forms.models import inlineformset_factory
eventschedule_formset_class = inlineformset_factory(Event, EventSchedule)
event_sched_formset = eventschedule_formset_class(request.POST or None,
                                                  instance=event_to_edit)

そのロジックは必要ありません。updateEvent保存するだけevent_sched_formsetで、イベントが正しく参照されます。

于 2012-07-20T14:01:50.693 に答える
0

このブログ投稿の助けを借りて、ダニエルの提案に従ってインライン モデル フォームセットを動作させることができました: http://charlesleifer.com/blog/djangos-inlineformsetfactory-and-you/

参考までに、見逃していた重要な点の 1 つは、フォームセットのインスタンスが親モデルを参照していることです。また、テンプレートにフォームセットを手動で表示する場合は、{{ formset.id }} を含めることを忘れないでください。

于 2012-07-23T01:50:49.440 に答える
0

EventScheduleModelFormSet フォームを保存しようとしていますか? 初期データのみを設定するインスタンスはないため、毎回新しいオブジェクトを作成しています。または私は何かを逃していますか?

于 2012-07-20T13:51:00.623 に答える