【问题标题】:Django form will not validateDjango 表单不会验证
【发布时间】:2013-12-24 06:06:57
【问题描述】:

我正在使用 Django 表单,但由于某种原因,此表单无法验证!它可以提交,或者至少运行服务器显示带有代码 200(ok)的 http post 响应。但由于某种原因,我的表单无法通过 is_valid 测试!

views.py:

def new_show(request):
if request.method == 'POST':
    img_form = ImageForm(request.POST, request.FILES)
show_form = NewShowForm(request.POST)
if show_form.is_valid():
    new_Show = Show()
    new_Show.title=show_form.cleaned_data['title']
    new_Show.body=show_form.cleaned_data['body']
    new_Show.pub_date=timezone.now()
    new_Show.location=show_form.cleaned_data['location']
    new_Show.time=show_form.cleaned_data['time']
    new_Show.save()     
    if img_form.is_valid():
        image=Image(image=request.FILES['imageFile'])
        new_Show.image_set.add(image)
        return HttpResponseRedirect(reverse('shows'))

    else:
        return HttpResponseRedirect(reverse('shows'))
else:
    show_form = NewShowForm()
    img_form = ImageForm()
return render_to_response(
    'shows/new_show.html',
    {'show_form': show_form, 'img_form': img_form},
    context_instance=RequestContext(request)
    )

这是我的模板 sn-p:

    <form action="{% url "new_show" %}" method="post" enctype="multipart/form-data">
    {% csrf_token %}
    <p>{{ show_form.non_field_errors }}</p>
    <p>
        <label for="title">Title:</label>
        <input type="text" name="title"/>
    </p>
    <p>
        <label for="body">Body:</label>
        <textarea type="text" name="body"> </textarea>
    </p>

    <p>
        <label for="location">Location:</label>
        <input type="text" name="location"/>
    </p>
    <p>
        <label for="time">Date:</label>
        <input type="text" id="time" maxlength="25" size="25" name="time"><a href="javascript:NewCal('time','ddmmmyyyy',true,24)"><img src="{{ STATIC_URL }}../../static/cal.gif" width="16" height="16" border="0" alt="Pick a date"></a>

    </p>



<!-- Upload Form. Note enctype attribute! -->


    {% csrf_token %}
    <p>{{ img_form.non_field_errors }}</p>
    <p>{{ img_form.imageFile.label_tag }}</p>
    <p>
        {{ img_form.imageFile.errors }}
        {{ img_form.imageFile }}
    </p>

<p><input type="submit" value="Add Upcoming Show"></input></p>
</form>

这是我的表单类:

class NewShowForm(forms.Form):
    title=forms.CharField()
    body=forms.CharField(widget=forms.TextArea)
    location=forms.CharField()
    time=forms.DateTimeField(required=True)
class ImageForm(forms.Form):
    imageFile = forms.FileField(required=False, label='Select an Image')

请帮帮我!

【问题讨论】:

  • 请 a) 尝试修正缩进 b) 显示表单类声明。
  • 好的,我想我的缩进是对的。我添加了 forms.py
  • 基于对表单代码的快速浏览,我突然想到了两件事。一,默认情况下需要字段-您为time指定了required=True,但这不是必需的。如果您提交时未设置 titlebodylocation 的值,则该表单无效。如果这不是问题,我会检查为您的time 输入传递了哪些值。您已将其声明为 DateTimeField,并且如果您的 Javascript 小部件未生成该字段可以解析的字符串,则该字段无效。提交后您是否看到表单错误消息?
  • 不,我没有看到任何错误,即使我提交时没有输入任何值,这很奇怪。我认为你是对的,我取出了 javascript 小部件,它似乎正在工作......我将继续处理日期时间字段的格式
  • 这并不奇怪 - 除了non_field_errors,您的模板不会呈现来自show_form 的错误。如果你想自己渲染每个字段,你应该在某处渲染每个字段的errors属性。

标签: python html django forms validation


【解决方案1】:

如果 new_Show 是一个模型,为什么不创建一个 ModelForm 而不是 forms.Form

所以,而不是

class NewShowForm(forms.Form):
    title=forms.CharField()
    body=forms.CharField(widget=forms.TextArea)
    location=forms.CharField()
    time=forms.DateTimeField(required=True)
class ImageForm(forms.Form):
    imageFile = forms.FileField(required=False, label='Select an Image')

为什么不使用,

from django.forms import ModelForm
class NewShowForm(ModelForm):
    class Meta:
        model = NewShow

class ImageForm(ModelForm):
    class Meta:
        model = Image

?

使用ModelForm 将确保表单验证符合模型验证。而且,它可以切断你的代码(尤其是第 6 到 11 行)。

【讨论】:

    【解决方案2】:

    这将有助于在 if is_valid() 之前将这两行添加到您的视图中以查看它给出的错误:

    if request.method == 'POST':
      img_form = ImageForm(request.POST, request.FILES)
      show_form = NewShowForm(request.POST)
    
      print(form.is_valid())
      print(form.errors)
    
      if show_form.is_valid():
    

    您可以在此处粘贴错误,我们可以查看问题所在

    【讨论】:

      【解决方案3】:

      由于您已将 2 个 Django 表单放在一个 HTML 表单标签下,因此当您在前端提交表单时,您将通过 request.POST 发送一个额外的字段,而您的 NewShowForm 没有。如果你将这两个表单组合成一个 Django 表单,你应该可以让它工作。

      【讨论】:

      • 只有当表单共享一个字段名时才有意义。 Django 表单根据字段名称从POST dict 中提取值,并忽略它们没有字段的任何内容。
      • 另外,如果这是问题,最好使用prefix 表单参数来解决它,而不是将两个类强制在一起。
      猜你喜欢
      • 2017-08-24
      • 2020-06-10
      • 2021-06-19
      • 2018-04-16
      • 1970-01-01
      • 2011-03-10
      • 2011-01-19
      • 2021-06-05
      相关资源
      最近更新 更多