Skip to main content
 首页 » 编程设计

python之Django 表单字段不会被 POST 数据填充

2025年05月04日32dudu

我有一个带有自定义构造函数的模型表单。它检查是否需要文件,如果为假,则删除文件字段。它还有两个隐藏字段,我在我的 View 中对其进行了初始化。表单类如下:

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 请求期间确认表单确实已绑定(bind),并且我还在 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)) 

请您参考如下方法:

我觉得你的 View 函数不正确:

提交变量从何而来,在初始化发布的表单时,您缺少 file_required 参数,并且表单处理可能应该重新组织为如下内容:

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