Django форма перезаписи поля localflavor прерывается - PullRequest
0 голосов
/ 29 мая 2020

У меня есть следующая форма, которая генерирует ошибку 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})

Traceback:

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 Ответ

1 голос
/ 30 мая 2020

Я думаю, проблема в том, что код не отображает форму, если она недействительна. Для недопустимой формы функция возвращает 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/#CreateView

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

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