Ошибка проверки Django возникла, но не отображается для приложения корзины покупок - PullRequest
1 голос
/ 21 мая 2019

Я использую 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')

И действительно, слово «неверная форма» всплыло. Затем код переносит меня в корзину. Вместо этого я хочу оказаться на странице продукта и показать ошибку проверки, информирующую читателя о том, что оба поля не могут быть пустыми. Есть ли простой способ сделать это?

Для обязательных = Истинных полей в формах, если я оставлю это поле пустым, появится сообщение о том, что мне нужно его заполнить. Поэтому я хочу сделать что-то подобное, за исключением того, что проверка требует, чтобы оба поля не могли быть заполнены. пустой.

Это отличается от этого ответа Stackoverflow , потому что это регистрационная форма. Вы можете перенаправить его в ту же форму, тогда как для этого случая 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 %}

Ответы [ 2 ]

2 голосов
/ 21 мая 2019

Добавление этой строки в шаблон формы устраняет вашу проблему.

{{ cart_product_form.non_field_errors }}

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 %}
    {{ 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: (скопировано из официальной документации)

Обратите внимание, что любые ошибки, вызванные переопределением Form.clean (), не будут связаны с каким-либо конкретным полем.Они входят в специальное «поле» (называемое all ), к которому вы можете получить доступ через метод non_field_errors (), если вам нужно.Если вы хотите прикрепить ошибки к определенному полю в форме, вам нужно вызвать add_error ().

0 голосов
/ 21 мая 2019

Ваш взгляд безоговорочно перенаправляется на cart_details, поэтому неудивительно, что вы не видите ошибок валидации - вам придется предоставить недопустимую форму для этого.Вы должны перенаправить только когда сообщение успешно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...