我做了自己的项目,却被这个问题卡住了。我的表单在调用www.example.com _valid时总是返回Falseform.is。
这是我的代码:
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)
views.py:
此函数创建表单
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?
1条答案
按热度按时间j7dteeu81#
您需要传递数据,因此: