【问题标题】:Why am I getting form is invalid error in django?为什么我在 django 中收到 form is invalid 错误?
【发布时间】:2019-10-22 09:40:01
【问题描述】:

在 Django Web 框架中开发网站期间,我在验证表单时收到表单无效错误。

我在网上搜索了解决方案,但无法解决我的问题。

我的文件如下。

models.py

class Customer(models.Model):
    f_name = models.CharField(max_length = 30, null=True)
    last_name = models.CharField(max_length = 30, null= True)
    cont_no = models.CharField(max_length = 30, null= True)
    pincode = models.IntegerField(default=0)
    def __str__(self):
        return self.f_name

class Product(models.Model):
    name = models.CharField(max_length = 30, null= True)
    uniq_price = models.IntegerField(default=0) 
    def __str__(self):
        return self.name

class Order(models.Model):
    cust_name = models.ForeignKey(Customer,related_name='first_name', on_delete=models.CASCADE)
    prod_name = models.ForeignKey(Product, related_name='uniqe_price', on_delete=models.CASCADE)
    unit_price = models.IntegerField(default=0)
    quantity = models.IntegerField(default=0)
    total = models.IntegerField(default=0)

forms.py

class CustomerForm(forms.ModelForm):    
    class Meta:  
        model = Order  
        fields = "__all__"

views.py

def add_order(request):
    if request.method == "POST":
        form = CustomerForm(request.POST) 

        form.save() 
        return redirect("place_ord")                        

    else:
        form = CustomerForm()

home.html

 <form id="myForm" action="{% url 'add_order' %}" method="POST">
      {% csrf_token %}
      <h1>add order</h1>

      <label>Customer</label>
      <select id="custs" name="customer">
        <option value="">Select Customer</option>                    
        {% for cust in customers %}
          <option id="{{ cust.id }}" value="{{ cust.f_name }}">
                {{ cust.f_name }}
          </option>
        {% endfor %}
       </select><br><br>
       <label>Product</label>
        <select id="singleSelectTextDDJS" name="prods" onchange="singleSelectChangeText()">
        <option>Select Product</option>                    
        {% for prod in products %}
          <option value="{{ prod.uniq_price }}">
              {{ prod.name }}
          </option>
        {% endfor %}
       </select><br><br>
       <label>Price:</label>
      <input type="text" name="price" class="Pric" id="textFieldTextJS" readonly=""><br><br>

      Qualitys:<input type="number" id="qty" class="qtys" name="quality"><br><br>

      Total price:<input type="text" name="totals" class="totals" id="total" readonly="">
      <br><br>
      <button type="submit" name="submit">place order</button>       
    </form>

错误

File "C:\Python37\lib\site-packages\django\forms\models.py", line 453, in save
    'created' if self.instance._state.adding else 'changed',
ValueError: The Order could not be created because the data didn't validate.

我无法验证我的表单,谁能指导我我做错了什么?

【问题讨论】:

  • 什么是表单错误?
  • 只显示'表单无效'。
  • 您需要在某处打印form.errors,例如{{ form.errors }} 在您的模板中。 “表单无效”不是form.errors
  • 为什么你没有像这样在模板中渲染表单{{ form }}

标签: python django django-forms django-views


【解决方案1】:

问题在于您在表单中提供的选项。

value 应该是该对象的pk。 前 -

 <select id="custs" name="customer">
        <option value="">Select Customer</option>                    
        {% for cust in customers %}
          <option id="cust_{{ cust.id }}" value="{{cust.pk}}">
                {{ cust.f_name }}
          </option>
        {% endfor %}
       </select>

该值未通过选择字段进行验证。尝试在所有选项中仅输入有效值。

【讨论】:

    【解决方案2】:

    您必须在保存之前检查您的表单是否有效:

    def add_order(request):
      if request.method == "POST":
    
        form = CustomerForm(request.POST) 
        if form.is_valid():
           form.save() 
           return redirect("place_ord")                        
        else:
           print(form.errors)
      else:
        form = CustomerForm()
      return render(request, template, {'form':form')
    

    参考this

    【讨论】:

    • 我也试过了,但每次都会阻塞,所以我的问题是我的表单每次都无效。
    • 别忘了在模板{{ form }}@Moon中渲染表单
    【解决方案3】:

    更优雅的表单处理程序:

    def add_order(request):
        form = CustomerForm(request.POST or None) 
        if form.is_valid():
            form.save() 
            return redirect("place_ord")                        
        return render(request, 'myapp/form.html', {'form': form})
    

    【讨论】:

    • @YugandharChaudhari 它运行良好。如果方法是'GET',它会正常渲染;如果方法是'POST'并且发生错误,表单错误消息将显示在前端。
    • 你试过了吗?如果是get 请求,您将像这样通过form = CustomerForm(None)is_valid() 使用表单数据调用
    • @YugandharChaudhari 我在 7 年前从 Daniel Greenfeld's keynote 学习了这种模式,并在我们所有的代码库中使用它。
    猜你喜欢
    • 2021-10-03
    • 2019-08-20
    • 1970-01-01
    • 2019-01-15
    • 2020-12-06
    • 2020-09-24
    • 2015-05-24
    • 1970-01-01
    • 2017-08-02
    相关资源
    最近更新 更多