Django验证错误引起但未显示用于购物车应用程序



我正在运行Django 2.2,并写了一个简单的购物车。我希望同时验证两个字段,以使两者不能同时为空。以我的形式。py,

from django import forms
class CartAddProductForm(forms.Form):
    cc_handle = forms.CharField(required=False, label='CC Handle', empty_value='')
    lc_handle = forms.CharField(required=False, label='LC Handle', empty_value='')
    def clean(self):
        cleaned_data = super().clean()
        if cleaned_data.get('cc_handle') == '' and cleaned_data.get('lc_handle') == '':
            print("issue detected")
            raise forms.ValidationError('Either cc or lc handle is required.')
        return cleaned_data

这是遵循官方Django文档的清洁和验证彼此依赖的字段的官方文档。上面的print((语句让我知道该问题已被检测到,即两个字段都是空的。运行Django服务器,我看到确实检测到了问题,但是在原始页面顶部没有显示验证错误消息。原始页面是包含产品的产品页面,也是将产品添加到购物车中的链接。通常,验证错误消息显示在页面顶部。

根据文档,在调用is_valid((时进行验证。所以我在视图中放了诊断印刷。py

from django.shortcuts import render, redirect, get_object_or_404
from django.views.decorators.http import require_POST
from shop.models import Product
from .cart import Cart
from .forms import CartAddProductForm
@require_POST
def cart_add(request, product_id):
    cart = Cart(request)
    product = get_object_or_404(Product, id=product_id)
    form = CartAddProductForm(request.POST)
    if form.is_valid():
        cd = form.cleaned_data
        cart.add(product=product,
                cc_handle=cd['cc_handle'],
                lc_handle=cd['lc_handle'])
    else:
        print('invalid form')
    return redirect('cart:cart_detail')

确实弹出了"无效的形式"一词。然后,代码将我带到购物车。取而代之的是,我想要的是在产品页面上,并显示验证错误,告知读者这两个字段都不能为空。有一个简单的方法吗?

for quiends =表单中的true字段,如果我将其留为空白,则会弹出一条消息,说我需要填写。因此,我想做类似的事情空的。

这与此Stackoverflow答案不同,因为这是一种注册形式。您可以将其重定向到相同的形式,而对于这种情况,Cartaddproductform嵌入了网站上的所有产品页面中。如果可能的话,我希望验证与所需= true选项的字段同一阶段进行。

产品/详细信息。html模板看起来如下。

{% extends "shop/base.html" %}
{% load static %}
{% block title %}
{{ product.name }}
{% endblock %}
{% block content %}
<div class="product-detail">
    <img src="{% if product.image %}{{ product.image.url }}{% else %}{% static "img/no_image.png" %}{% endif %}">
    <h1>{{ product.name }}</h1>
    <h2><a href="{{ product.category.get_absolute_url }}">{{ product.category }}</a></h2>
    <p class="price">${{ product.price }}</p>
    <form action="{% url "cart:cart_add" product.id %}" method="post">
    {{ cart_product_form }}
    {% csrf_token %}
    <input type="submit" value="Add to cart">
    </form>
    {{ product.description|linebreaks }}
</div>
{% endblock %}

在表单模板中添加此行已清除您的问题。

{{ cart_product_form.non_field_errors }}

product/deled.html:

{% extends "shop/base.html" %}
{% load static %}
{% block title %}
{{ product.name }}
{% endblock %}
{% block content %}
<div class="product-detail">
    <img src="{% if product.image %}{{ product.image.url }}{% else %}{% static "img/no_image.png" %}{% endif %}">
    <h1>{{ product.name }}</h1>
    <h2><a href="{{ product.category.get_absolute_url }}">{{ product.category }}</a></h2>
    <p class="price">${{ product.price }}</p>
    <form action="{% url "cart:cart_add" product.id %}" method="post">
    {{ cart_product_form }}
    {% csrf_token %}
    {{ cart_product_form.non_field_errors }} // This line will raise validation errors
    <input type="submit" value="Add to cart">
    </form>
    {{ product.description|linebreaks }}
</div>
{% endblock %}

doc:(从官方文档复制(

请注意,您的表格引起的任何错误。 尤其与任何字段相关联。他们进入一个特别 " field"(称为 ash ash all (,您可以通过 non_field_errors((方法(如果需要(。如果要附加错误 到表格中的特定字段,您需要调用add_error((。

您的视图是区分重定向到cart_details,因此毫不奇怪,您不会看到验证错误 - 您必须为此呈现无效的表单。您只有在帖子成功时才会重定向。

最新更新