0

私には1つの大きなオブジェクトがあります-ユーザーの旅行のレポートです。そのレポートのいくつかのフィールドを1つずつ編集するためのインターフェースをユーザーに提供しました。ユーザーは一度に1つのフィールドを編集できるので、ユーザーが編集したいフィールドに基づいてモデルフォームを作成するメソッドを作成しました。

それはそのように機能します:

def createFieldEditorForm(client, field, report_id, request = None):
    from django.shortcuts import get_object_or_404
    report_instance = get_object_or_404(DriveReport, id = report_id)

    class FieldEditorForm(forms.ModelForm):

        class Meta:
            model = DriveReport
            fields = ['id', ]

        id = forms.IntegerField(label = _(u"ride_id"), widget=forms.HiddenInput())

        def __init__(self, *args, **kwargs):
            super(FieldEditorForm, self).__init__(*args, **kwargs)

            self.build_fields()

        def build_fields(self):
            if field == 'driver_id':
                driver_query = Driver.objects.filter(client = client)
                choices = [('', u'------'),]
                for driver in driver_query:
                    choices.append((driver.id, driver.name))
                self.fields[field] = forms.IntegerField(
                    label = _(u"Drivers"), 
                    widget = forms.Select(
                        choices = choices,
                        attrs = {'data-name':'driver_id'} ),
                    required = False)
            elif field == 'project_id':
                area_query = Area.objects.filter(client = client)
                choices = [('', u'------'),]
                for area in area_query:
                    choices.append((area.id, area.name))
                self.fields[field] = forms.IntegerField(
                    label = _(u"Projects"), 
                    widget = froms.Select(
                        choices = choices,
                        attrs = {'data-name':'project_id'} ),
                    required = False)
            elif field == 'trip_type':
                self.fields[field] = forms.CharField(
                    label = _(u"Projects"), 
                    widget = forms.Select(
                        choices = [(key, value) for key, value in TRIP_TYPE_CHOICES.iteritems()],
                        attrs = {'data-name':'trip_type'} ),
                    required = False)
            else:
                self.fields[field] = forms.CharField(required = False, widget = forms.TextInput(attrs = {'data-name':field} ))

if request is None:
    return FieldEditorForm(instance = report_instance)
else:
    return FieldEditorForm(request, instance = report_instance)

そして視野に入れて

それはそのようになります:

if request.method == 'POST':
    form = createFieldEditorForm(activeaccount, field_id, ride_id, request.POST)
    if form.is_valid():
        form.save()
        messages.success(request, _("New field value successfully added/updated"))
    else:
        messages.error(request, _("Value was not saved"))

    return feedback_to_json(request, form)

結果は次のとおりです。ブラウザに成功メッセージが表示されますが、フィールドは更新されません。

form.save()メソッドを上書きして、self.cleaned_dataに[field]が含まれているかどうかを確認してみました。その権利があります。保存前と保存後にフォームを印刷しても、データがバックエンドに到達し、すべてがきれいになっていることがわかります。しかし、いまいましい値はデータベースに保存/更新されません。

4

1 に答える 1

2

ModelForm の保存機能は、fields属性内の実際のフィールドでのみ機能します。フィールドを動的に追加しているため、それらを手動で保存する必要があります (commit=False でフォームを保存し、返された保存されていないオブジェクトにデータを追加します)。

于 2012-06-14T14:45:14.840 に答える