2

カスタム コンストラクターを使用したモデル フォームがあります。ファイルが必要かどうかを確認し、そうでない場合はファイル フィールドを削除します。また、ビューで初期化する 2 つの隠しフィールドもあります。フォーム クラスは次のとおりです。

class SubmitTask(forms.ModelForm):
    task = forms.ModelChoiceField(queryset=Task.objects.all(), widget=forms.HiddenInput())
    student = forms.ModelChoiceField(queryset=UserProfile.objects.all(), widget=forms.HiddenInput())    

    def __init__(self, file_required=False, *args, **kwargs):
            super(SubmitTask, self).__init__(*args, **kwargs)
            if file_required is True:
                    file = forms.FileField(
                            label='Select a file',
                            help_text='max: 2.5 MB'
                    )
            else:
                    del self.fields['file']

    class Meta:
            model = Submission
            exclude = ('date_submitted',)

私の問題は、フォームを初期化するときに隠しフィールドが入力されることです (HTML コードを表示して、その値が実際に初期化されることを確認しました)。ただし、非表示フィールドの値は、POST 要求中に入力されません。POST リクエスト中に、フォームが実際にバインドされていることを確認しました。また、Firebug で、POST にもtaskとのstudent値が含まれていることを確認しました。これは私の関与する方法ですviews.py

def view_task(request, id):
    task = Task.objects.get(pk=id)
    profile = request.user.get_profile()

    data = {}
    data['classroom'] = task.get_classroom()
    data['description'] = task.get_description()

    teacher_classrooms = Classroom.objects.filter(teacher=profile)
    teacher_tasks = Task.objects.filter(classroom__in=teacher_classrooms)

    if not submission and task not in teacher_tasks:
        form = SubmitTask(file_required=task.file_required, initial={'task':task.pk, 'student':profile.pk})

        data['form'] = form
        if request.method == 'POST':
            form = SubmitTask(request.POST, request.FILES)

            if form.is_valid():
                form.save()

    return render_to_response('classrooms/view_task.html',
        data, context_instance=RequestContext(request))
4

1 に答える 1

1

あなたのビュー関数は私には正しく見えません:

送信変数はどこから来たのですか。投稿されたフォームを初期化するときに file_required パラメータが欠落しており、フォーム処理はおそらく次のように再編成する必要があります。

if request.method == 'POST':
    form = SubmitTask(task.file_required, request.POST, request.FILES)
    ...
else:
    form = SubmitTask(task.file_required, ...)

data['form'] = form
于 2012-11-21T18:45:42.407 に答える