gpt4 book ai didi

python - 购物车应用程序出现 Django 验证错误但未显示

转载 作者:行者123 更新时间:2023-12-01 00:56:15 25 4
gpt4 key购买 nike

我正在运行 Django 2.2 并编写了一个简单的购物车。我希望同时验证两个字段,使得两个字段不能同时为空。在我的 forms.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 docs清理和验证相互依赖的字段。上面的 print() 语句让我知道问题已被检测到,即两个字段都是空的。运行 Django 服务器,我发现确实检测到了问题,但原始页面顶部没有显示验证错误消息。原始页面是包含产品和将产品添加到购物车的链接的产品页面。通常验证错误消息显示在页面顶部。

根据文档,验证是在调用 is_valid() 时完成的。所以我把我的views.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')

确实出现了“无效形式”的字样。然后代码将我带到购物车。相反,我想要的是在产品页面上显示验证错误,通知读者这两个字段不能为空。有简单的方法吗?

对于表单中的required=True字段,如果我将其留空,将会弹出一条消息,说我需要填写它。所以我想做类似的事情,除了验证要求两个字段都不能是空的。

这与此不同Stackoverflow answer因为那是一张登记表。您可以将其重定向到相同的表单,而在这种情况下,CartAddProductForm 嵌入到网站上的所有产品页面中。如果可能的话,我希望验证发生在与 required=True 选项的字段相同的阶段。

product/detail.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 %}

最佳答案

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

{{ car​​t_product_form.non_field_errors }}

产品/detail.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 %}

文档:(从官方文档复制)

Note that any errors raised by your Form.clean() override will not be associated with any field in particular. They go into a special “field” (called all), which you can access via the non_field_errors() method if you need to. If you want to attach errors to a specific field in the form, you need to call add_error().

关于python - 购物车应用程序出现 Django 验证错误但未显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56232238/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com