0

最初にコード。ModelForm(im1とim2はmodels.ImageFieldです):

class TestForm(forms.ModelForm):
    checkme = forms.BooleanField(required=True)

    class Meta:
        model = UserProfile
        fields = ('im1', 'im2')

景色:

def test(request):
    profile = request.user.get_profile()
    form = TestForm(instance=profile)
    if request.method == "POST":
        form = TestForm(request.POST, request.FILES, instance=profile)
        if form.is_valid():
            form.save()
    return render(request, 'test.html', {'form':form})

テンプレート:

<html>
<head>
<title>Test</title>
</head>
<body>
<form method="post" enctype="multipart/form-data">{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="submit" />
</form>
</body>
</html>

問題点:

im1に有効な画像が含まれていて、その横にあるクリアチェックボックスをオンにしても、チェックボックスをオンにして送信しない場合、フォームにチェックボックスが必要であるというエラーが返されます。フォームはエラーとともに返されますが、im1がクリアされたように見えます。実際には、フォームをリロードすると、im1がファイルとともにバックアップされ、チェックボックスをオフにするため、そうではありません。

私の質問は、どうすればこれを修正できますか?それは私がしていることですか、それともdjangoと関係がありますか?

4

1 に答える 1

0

Djangoは正確に動作しています。

リクエストがPOSTリクエストの場合、フォームはとからのデータにバインドされrequest.POSTますrequest.FILESinstance=profileすべての検証に合格した場合に保存する特定のオブジェクトをフォームに指示するだけです。フォームが有効でない場合でも、クリアされた画像を使用してデータにバインドされ、それがに渡されrender()ます。

まず、リクエストメソッドがPOSTの場合、最初にバインドされたフォームを作成しないでください。

def test(request):
    profile = request.user.get_profile()
    if request.method == "POST":
        form = TestForm(request.POST, request.FILES, instance=profile)
        if form.is_valid():
            form.save()
    else:
        form = TestForm(instance=profile)
    return render(request, 'test.html', {'form':form})

次に、ユーザーが実際に画像を削除したいが、単に別のチェックボックスを見逃した場合に、ユーザーに同じ正確なアクションを2回実行させたいのはなぜですか。

このように動作するためにDjangoが本当に必要な場合は、2つのことのいずれかを実行します。UserProfileのインスタンスからバインドされたフォームを作成し、無効なフォームと新しく作成されたフォームの両方をテンプレートに渡し、無効なフォームを使用してエラーを表示し、もう1つを使用してフォームの残りの部分を表示します。

def test(request):
    profile = request.user.get_profile()
    if request.method == "POST":
        errors_form = TestForm(request.POST, request.FILES, instance=profile)
        if errors_form.is_valid():
            errors_form.save()
            form = errors_form
        else:
            form = TestForm(instance=profile)
            return render(request, 'test.html', {'form':form, 'errors_form': errors_form})
    else:
        form = TestForm(instance=profile)
    return render(request, 'test.html', {'form':form})

または、同じことを行いますが、無効なフォームから新しく作成されたフォームにエラーを保存して、あちこちに行き渡らないようにしますrenders()

def test(request):
    profile = request.user.get_profile()
    if request.method == "POST":
        errors_form = TestForm(request.POST, request.FILES, instance=profile)
        if errors_form.is_valid():
            errors_form.save()
            form = errors_form
        else:
            form = TestForm(instance=profile)
            #this is left up to you to implement, but you'd do something like
            #form.errors = errors_form.errors
            #and also iterate through every form attribute.errors and assign it to
            #errors_form attribute.errors etc...
    else:
        form = TestForm(instance=profile)
    return render(request, 'test.html', {'form':form})

どちらもあまり洗練されたソリューションではなく、Django Formsの実装に完全に精通していないため、2番目のソリューションがさらにハックしなくても期待どおりに機能するかどうかはわかりません。

これを行う価値があるとは思いません。前に述べたように、あなたはあなたのユーザーのためにより多くの仕事を作成しているだけです...

于 2011-09-06T20:40:31.413 に答える