django 方法form.is_valid始终返回always

vwkv1x7d  于 2022-12-05  发布在  Go
关注(0)|答案(1)|浏览(110)

我做了自己的项目,却被这个问题卡住了。我的表单在调用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?

j7dteeu8

j7dteeu81#

您需要传递数据,因此:

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

相关问题