【问题标题】:Form not Submitting value when clicking submit button单击提交按钮时表单未提交值
【发布时间】:2020-12-03 23:34:21
【问题描述】:

我正在使用 django 表单提交报告。但是点击提交按钮后,它会发送 POST 请求,但 POST 请求中没有添加任何数据。

这是我的forms.py

class WeeklyForm(forms.Form): 

    tname = forms.ModelMultipleChoiceField(queryset=CustomTeacher.objects.values_list('tname', flat = True), widget =forms.Select( attrs ={'class': 'form-control' , 'placeholder' : ' Teachers Name '}))

    sname = forms.ModelMultipleChoiceField(queryset=CustomStudent.objects.values_list('sname', flat = True), widget =forms.CheckboxSelectMultiple( attrs ={'class': 'form-control' 'form-check-input' 'form-check-inline', 'placeholder' : ' Students Name '}))

    class_name = forms.CharField(widget= forms.Select(choices= [('1', 'UKG'), ('2', 'Class 1'), ('3', 'LKG'), ('4', 'Montessori') ] ,attrs={'class': 'form-control', 'placeholder' : 'Select Class'}))

    date =  forms.DateField(initial = datetime.date.today() , required=False, widget =forms.DateInput( attrs ={'class': 'form-control' , 'placeholder' : ' Date ', 'name' : 'date'}))

    objective = forms.CharField(widget = forms.Textarea(attrs={'class': 'form-control', 'placeholder' : 'objective'}))
 
    target = forms.CharField(widget = forms.Textarea(attrs={'class': 'form-control', 'placeholder' : 'target'}))
    
    how = forms.CharField(widget = forms.Textarea(attrs={'class': 'form-control', 'placeholder' : 'how?'}))
    
    material = forms.CharField(widget = forms.Textarea(attrs={'class': 'form-control', 'placeholder' : 'material required'}))

    support = forms.CharField(widget = forms.Textarea(attrs={'class': 'form-control', 'placeholder' : 'Any Support Required?'}))

这是来自views.py的函数,我用它来获取数据并插入数据库

view.py

def weekly(request):
    
    context = ''
    form = WeeklyForm()
    context = {'form': form} 
    if request.method == 'POST':
        form = WeeklyForm(request.POST)

        if form.is_valid():
            tname1 = form.cleaned_data['teachers']
            sname1 = form.cleaned_data['students']
            date1 = form.cleaned_data['date']
            objective1 = form.cleaned_data['objective']
            tplan1 = form.cleaned_data['target']
            how1 = form.cleaned_data['how']
            material1 = form.cleaned_data['material']
            extra1 = form.cleaned_data['support']

            print (tname1)
            report = wreport(tname = tname1, sname = sname1, fdate = date1, objective = objective1, tplan = tplan1, how = how1, material = material1, extra = extra1)
            report.save()

            messages.success(request, "Your report was submitted Successfully.")
    else:
            form = WeeklyForm()
            context = {'form': form}
    return render(request, 'teacher/weekly.html', context)

我只展示了一个模板示例,因为有很多行代码。 每周.html

<form action="" method="POST">
    {% csrf_token %}
    <!-- Teacher section  -->
    <div class="row">
        <div class="col-lg-3 mb-2">
            <div><strong>Teacher's Name:</strong></div>
        </div>
        <div class="col-lg-9">
            {{ form.teachers }}
        </div>
    </div>
    
    <!-- Student section -->
    <div class="row mt-4">
        <div class="col-lg-3">
            <!-- name="sname" id="sname" -->
            <div><strong>Student's Name:</strong></div>
        </div>
        <div class="col-lg-9">

            <div class="form-check-inline">
                <label class="form-check-label">
                    <!-- {% for student in students %}
                        <input type="checkbox" class="form-check-input" value="">
                        {{student.sname}}
                    {% endfor %} -->
                </label>
            </div>
            {{ form.sname }}
        </div>
    </div>

    <!-- submit button  -->
    <div class="row">
        <div class="mx-auto">

            <button type="submit" class="btn btn-outline-dark mb-4 shadow" style="border-radius:25px;">Submit</button>
        </div>
    </div>
</form>

我已尝试调试和打印从表单接收到的值,但没有打印任何内容。

编辑:经过进一步调试,我发现我的表单没有验证这是我使用form.errors 函数捕获的错误

<ul class="errorlist"><li>tname<ul class="errorlist"><li>Enter a list of values.</li></ul></li><li>sname<ul class="errorlist"><li>“Test Student” is not a valid value.</li></ul></li></ul>

【问题讨论】:

  • 你能不能把你的 HTML 因为我认为你没有在你的 HTML 中使用 {{ form }} 标签
  • @lbvasoya 我没有在 html 中调用{{ form }},而是将其称为{{ form.teacher }},正如您在代码中看到的那样,因为我想在使用自定义时获取正确部分中的字段html 样式和带表单的引导程序。所以我只在 html 的各个 div 中从表单中调用一个字段。

标签: html python-3.x django forms django-forms


【解决方案1】:

首先:当你使用 queryset 属性时,你需要分配 queryset,而每当使用选项属性时,你需要分配 list 或 dict

第二次:当您尝试请求相同的 URL 时。您必须在表单中删除 action

当您想对另一个 URL 进行请求时。您必须添加正在调用的视图的操作网址

这里是form.py

class WeeklyForm(forms.Form): 

    tname = forms.ModelMultipleChoiceField(queryset=CustomTeacher.objects.all(), widget =forms.Select( attrs ={'class': 'form-control' , 'placeholder' : ' Teachers Name '}))

    sname = forms.ModelMultipleChoiceField(queryset=CustomStudent.objects.all(), widget =forms.CheckboxSelectMultiple( attrs ={'class': 'form-control' 'form-check-input' 'form-check-inline', 'placeholder' : ' Students Name '}))

    class_name = forms.CharField(widget= forms.Select(choices= [('1', 'UKG'), ('2', 'Class 1'), ('3', 'LKG'), ('4', 'Montessori') ] ,attrs={'class': 'form-control', 'placeholder' : 'Select Class'}))

    date =  forms.DateField(initial = datetime.date.today() , required=False, widget =forms.DateInput( attrs ={'class': 'form-control' , 'placeholder' : ' Date ', 'name' : 'date'}))

    objective = forms.CharField(widget = forms.Textarea(attrs={'class': 'form-control', 'placeholder' : 'objective'}))
 
    target = forms.CharField(widget = forms.Textarea(attrs={'class': 'form-control', 'placeholder' : 'target'}))
    
    how = forms.CharField(widget = forms.Textarea(attrs={'class': 'form-control', 'placeholder' : 'how?'}))
    
    material = forms.CharField(widget = forms.Textarea(attrs={'class': 'form-control', 'placeholder' : 'material required'}))

    support = forms.CharField(widget = forms.Textarea(attrs={'class': 'form-control', 'placeholder' : 'Any Support Required?'}))

这里我认为是同一个 URL 上的请求

<form method="POST">
    {% csrf_token %}
    <!-- Teacher section  -->
    <div class="row">
        <div class="col-lg-3 mb-2">
            <div><strong>Teachers Name:</strong></div>
        </div>
        <div class="col-lg-9">
            {{ form.teachers }}
        </div>
    </div>

    <!-- submit button  -->
    <div class="row">
        <div class="mx-auto">

            <button type="submit" class="btn btn-outline-dark mb-4 shadow" style="border-radius:25px;">Submit</button>
        </div>
    </div>
</form>

这里是视图

def weekly(request):
    
    context = ''
    form = WeeklyForm()
    context = {'form': form} 
    if request.method == 'POST':
        form = WeeklyForm(request.POST)

        if form.is_valid():
            data = form.cleaned_data
            print (data)

            report = wreport(tname = data['teachers'], sname = data['students'], fdate = data['date'], objective = data['objective'], tplan = data['target'], how = data['how'], material = data['material'], extra = data['support'])
            report.save()

            messages.success(request, "Your report was submitted Successfully.")
    else:
            form = WeeklyForm()
            context = {'form': form}
    return render(request, 'teacher/weekly.html', context)

希望你能理解我想说的话,让我知道任何查询问题

【讨论】:

  • 感谢您的回答。调试完我的问题后,我发现该表单无法验证 sname 我将更新该部分的 html 和 form.errors
  • 所以我认为你必须回答你的问题并接受这样的事实
  • 不幸的是,这不是答案。我无法理解为什么表单不验证复选框。表单中带有CheckboxSelectMultiple 字段。
  • 你必须通过 sname = forms.ModelMultipleChoiceField(queryset=CustomStudent.objects.all(), widget =forms.CheckboxSelectMultiple( attrs ={'class': 'form-control' 'form-check-input' 'form-check-inline', 'placeholder' : ' Students Name '}) 如果你使用选项,你需要在查询集属性上传递查询集然后你必须修改和分配列表或选择的字典让我知道它工作
  • 在清除 sname 的错误后,现在它出现在 tname 中,这是一个下拉字段所以我使用了forms.select,正如您所见的查询集,我也更新了 tname 字段的查询集。这是新错误&lt;ul class="errorlist"&gt;&lt;li&gt;tname&lt;ul class="errorlist"&gt;&lt;li&gt;Enter a list of values.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;