简体   繁体   English

Django localflavor 字段覆盖破坏表单

[英]Django localflavor field overwrite breaks form

I have the following form, which generates a Value error upon submition.我有以下表格,在提交时会生成值错误。

ValueError at /en/orders/create/ /en/orders/create/ 的 ValueError

The view orders.views.order_create didn't return an HttpResponse object. It returned None instead.视图 orders.views.order_create 没有返回 HttpResponse object。而是返回 None。

my form:我的表格:

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']

my model:我的 model:

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}'

my view:我的看法:

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.

The process works fine, and redirects to a payment form, without this line in the form: postal_code = USZipCodeField()该过程工作正常,并重定向到付款表单,但表单中没有此行:postal_code = USZipCodeField()

I cant seem to understand what causes the error.我似乎无法理解导致错误的原因。

Expected behavior:预期行为:

On valid form, redirect to payment.在有效表格上,重定向到付款。

On invalid form, validation error that is raised by USZipCodeField: "Enter a zip code in the format XXXXX or XXXXX-XXXX."在无效表单上,USZipCodeField 引发的验证错误:“以 XXXXX 或 XXXXX-XXXX 格式输入 zip 代码。”

I think the issue is that the code isn't rendering the form in the case that the form isn't valid.我认为问题是在表单无效的情况下代码不会呈现表单。 For an invalid form, the function returns None which is exactly the error message you're seeing.对于无效的表单,function 返回None ,这正是您看到的错误消息。 Maybe you're submitting an empty or invalid value?也许您提交的是空值或无效值? Try this modified (untested) version:试试这个修改过的(未经测试的)版本:

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})

Does this work?这行得通吗?

You might want to consider using the built-in CreateView to avoid boilerplate form processing code: https://docs.djangoproject.com/en/3.0/ref/class-based-views/flattened-index/#CreateView您可能需要考虑使用内置的CreateView来避免样板表单处理代码: https://docs.djangoproject.com/en/3.0/ref/class-based-views/flattened-index/#CreateView

If you haven't used class-based views, it's definitely something to look into.如果您还没有使用过基于类的视图,那绝对值得研究。 I find I can move a little faster using them but they do take a bit of time to learn and make the flow a little harder to follow when things don't work.我发现使用它们我可以移动得更快一些,但是它们确实需要一些时间来学习并且当事情不起作用时让流程更难遵循。 Here are the full docs for the class based views:https://docs.djangoproject.com/en/3.0/topics/class-based-views/以下是基于 class 的视图的完整文档:https://docs.djangoproject.com/en/3.0/topics/class-based-views/

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM