Форма перезаписи поля localflavor в django

У меня есть следующая форма, которая генерирует ошибку Value при отправке.

ValueError в /en/orders/create/

Представление orders.views.order_create не вернуло объект HttpResponse. Вместо этого он вернул None.

моя форма:

from django import forms
from .models import Order
from localflavor.us.forms import USZipCodeField


class OrderCreateForm(forms.ModelForm):
    postal_code = USZipCodeField()

    class Meta:
        model = Order

        fields = ['first_name', 'last_name', 'email', 'address',
                  'postal_code', 'city']

моя модель:

class Order(models.Model):
    first_name = models.CharField(_('first name'), max_length=50)
    last_name = models.CharField(_('last name'), max_length=50)
    email = models.EmailField(_('e-mail'))
    address = models.CharField(_('address'), max_length=250)
    postal_code = models.CharField(_('postal code'), max_length=20)
    city = models.CharField(_('city'), max_length=100)
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)
    paid = models.BooleanField(default=False)

    class Meta:
        ordering = ('-created', )

    def __str__(self):
        return f'Order {self.id}'

мой вид:

def order_create(request):
    if request.method == 'POST':
        form = OrderCreateForm(request.POST)

        if form.is_valid():
            order.save()

            request.session['order_id'] = order.id

            # redirect for payment return
            return redirect(reverse('payment:process'))

    else:
        form = OrderCreateForm()
        return render(request,
                      'orders/order/create.html',
                      {'cart': cart, 'form': form})

Выслеживать:

Environment:


Request Method: POST
Request URL: http://127.0.0.1:8000/en/orders/create/

Django Version: 3.0.6
Python Version: 3.8.2
Installed Applications:
['django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'rosetta',
 'parler',
 'localflavor',
 'shop.apps.ShopConfig',
 'cart.apps.CartConfig',
 'orders.apps.OrdersConfig',
 'payment.apps.PaymentConfig',
 'coupons.apps.CouponsConfig']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.locale.LocaleMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware']



Traceback (most recent call last):
  File "/home/[user]/.virtualenvs/shop/lib/python3.8/site-packages/django/core/handlers/exception.py", line 34, in inner
    response = get_response(request)
  File "/home/[user]/.virtualenvs/shop/lib/python3.8/site-packages/django/core/handlers/base.py", line 124, in _get_response
    raise ValueError(

Exception Type: ValueError at /en/orders/create/
Exception Value: The view orders.views.order_create didn't return an HttpResponse object. It returned None instead.

Процесс работает нормально и перенаправляет на платежную форму без этой строки в форме: postal_code = USZipCodeField()

Кажется, я не могу понять, что вызывает ошибку.

Ожидаемое поведение:

В действующей форме перенаправить на оплату.

В недопустимой форме ошибка проверки, которую вызывает USZipCodeField: "Введите почтовый индекс в формате XXXXX или XXXXX-XXXX".

1 ответ

Решение

Я думаю, проблема в том, что код не отображает форму, если она недействительна. Для недопустимой формы функция возвращаетNoneэто именно то сообщение об ошибке, которое вы видите. Может быть, вы отправляете пустое или недействительное значение? Попробуйте эту модифицированную (непроверенную) версию:

def order_create(request):
    if request.method == 'POST':
        form = OrderCreateForm(request.POST)

        if form.is_valid():
            order = form.save()

            request.session['order_id'] = order.id

            # redirect for payment return
            return redirect(reverse('payment:process'))

    else:
        form = OrderCreateForm()

    # FIXME Where does 'cart' come from?
    return render(request,
                  'orders/order/create.html',
                  {'cart': cart, 'form': form})

Это работает?

Возможно, вы захотите использовать встроенный CreateViewчтобы избежать кода обработки шаблонной формы:https://docs.djangoproject.com/en/3.0/ref/class-based-views/flattened-index/

Если вы не использовали представления на основе классов, вам определенно стоит посмотреть. Я считаю, что с их помощью я могу двигаться немного быстрее, но им требуется немного времени, чтобы научиться, и усложняют процесс отслеживания, когда что-то не работает. Вот полные документы для представлений на основе классов:https://docs.djangoproject.com/en/3.0/topics/class-based-views/

Другие вопросы по тегам