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