方法表单.Is_valid总是返回always



我做我自己的项目,我被这个问题卡住了。当调用form.is_valid时,我的表单总是返回False。

这是我的代码:

forms.py:
我需要让用户从可用的大小列表中选择他需要的大小,所以我从数据库中检索大小,然后用这些大小的变体创建一个ChoiceField。

class CartAddProductForm(ModelForm):
class Meta:
model = Product
fields = ['sizes']
def __init__(self, pk: int, *args, **kwargs) -> None:
super(CartAddProductForm, self).__init__(*args, **kwargs)
sizes = tuple(Product.objects.get(pk=pk).sizes)
sizes_list = []
for item in sizes:
sizes_list.append((item, item))
self.fields['sizes'] = forms.ChoiceField(choices=sizes_list)
这个函数创建表单
def product_detail(request: WSGIRequest, product_id: int, product_slug: str) -> HttpResponse:
product = get_object_or_404(Product,
id=product_id,
slug=product_slug,
available=True)
categories = Category.objects.all()
cart_product_form = CartAddProductForm(instance=product, pk=product_id)
return render(request, 'shop/product/detail.html', {'product': product,
'categories': categories,
'cart_product_form': cart_product_form})

当用户按下"添加到购物车"按钮时,他被重定向到另一个页面,其中包含他的购物车的详细信息。那么问题来了:

@require_POST
def add_to_cart(request: WSGIRequest, product_id: int) -> HttpResponseRedirect:
cart = Cart(request)
product = get_object_or_404(Product, id=product_id)
form = CartAddProductForm(instance=product, pk=product_id)
if form.is_valid():
cd = form.cleaned_data
print(f'cd = {cd}')
cart.add(product=product,
quantity=cd['quantity'],
update_quantity=cd['update'])
else:
print(f'form.is_valid = {form.is_valid()}')
print(f'request.POST = {request.POST}')
print(f'form.errors = {form.errors}')
print(f'form.non_field_errors = {form.non_field_errors}')
field_errors = [(field.label, field.errors) for field in form]
print(f'field_errors = {field_errors}')
return redirect('cart:cart_detail')

我的模板:

{% extends "shop/base.html" %}
<head>
<meta charset="UTF-8">
<title>Detail</title>
</head>
<body>
{% block title %}
{{ product.name }}
{% endblock %}
{% block content %}
<br>
<b>{{ product.name }} </b> <br>
<i>{{ product.description }} </i> <br>
{{ product.price }} <br>
<img src="{{ product.image.url }}" width="300" height="500"> <br>
Доступные размеры: <br>
{{ product.sizes }}<br>
<form action="{% url "cart:add_to_cart" product.id %}" method="post">
{{ cart_product_form }}
{{ form.as_p }}
{% csrf_token %}
<input type="submit" value="Add to cart">
</form>
{% endblock %}
</body>

urls . py:

urlpatterns = [
re_path(r'^$', views.cart_detail, name='cart_detail'),
re_path(r'^add/(?P<product_id>d+)/$', views.add_to_cart, name='add_to_cart'),
re_path(r'^remove/(?P<product_id>d+)/$', views.cart_remove, name='cart_remove'),
]

我试着打印错误,但是一无所获:

print(f'form.is_valid = {form.is_valid()}')
print(f'request.POST = {request.POST}')
print(f'form.errors = {form.errors}')
print(f'form.non_field_errors = {form.non_field_errors}')
field_errors = [(field.label, field.errors) for field in form]
print(f'field_errors = {field_errors}')

输出:

form.is_valid = False
request.POST = <QueryDict: {'sizes': ['S'], 'csrfmiddlewaretoken': ['mytoken']}>
form.errors =
form.non_field_errors = <bound method BaseForm.non_field_errors of <CartAddProductForm bound=False, valid=False, fields=(sizes)>>
field_errors = [('Sizes', [])]

我也不得不说,重定向到购物车页面后,没有详细信息,它是空的,没有项目。什么是错的,为什么我的形式返回False?

您需要传递数据,因此:

form = CartAddProductForm(
instance=product,
pk=product_id,
data=request.POST,
)

最新更新