首页 > 解决方案 > /products/1/buy/ 'OrderForm' 对象的 AttributeError 没有属性 'save'

问题描述

我正在尝试构建一个 django 表单以在我的电子商务网站中下订单。但是,当我按下Place Order按钮时,我得到了这个回溯错误:

Internal Server Error: /products/1/buy/
Traceback (most recent call last):
  File "C:\Users\Dell\Desktop\Django\apnibakery\venv\lib\site-packages\django\core\handlers\exception.py", line 47, in inner
    response = get_response(request)
  File "C:\Users\Dell\Desktop\Django\apnibakery\venv\lib\site-packages\django\core\handlers\base.py", line 179, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "C:\Users\Dell\Desktop\Django\apnibakery\bakery\apnibakeryy\views.py", line 33, in buy
    form.save()
AttributeError: 'OrderForm' object has no attribute 'save'
[07/Dec/2020 14:06:34] "POST /products/1/buy/ HTTP/1.1" 500 64996

这是我的OrderForm

class OrderForm(forms.Form):
    name = forms.CharField(max_length=30)
    email = forms.EmailField()
    address = forms.CharField(widget=forms.Textarea())
    zip_code = forms.CharField(min_length=6,max_length=6)

我处理订单的视图函数:

def buy(request,id):
    product = Product.objects.get(id=id)
    form = OrderForm()

    if request.method == 'POST':
        form = OrderForm(data=request.POST)
        if form.is_valid():
            form.save()
            return HttpResponse("Your order has been successfully placed!!")
    context = {
        'form':form,
        'product':product,
    }
    return render(request, 'buy_page.html',context)

我以前从未遇到过这个错误。有人可以帮我吗?

标签: pythondjango

解决方案


AForm没有.save()方法。尚不清楚这意味着什么,因为Form例如 a 不是针对模型量身定制的。因此,它可以例如不创建或更新数据库中的记录。

但是,您可以save()自己实现一个方法。例如,然后将发送电子邮件的方法:

class OrderForm(forms.Form):

    # …

    def save(self):
        cleaned_data = self.cleaned_data
        # …

cleaned_data是一个将字段名称( 、 等)映射nameemail相应值的字典。

因此,您可以发送一封基本的电子邮件,例如:

from django.core.mail import send_mail

class OrderForm(forms.Form):

    # …

    def save(self):
        cleaned_data = self.cleaned_data
        send_mail(
            'Your order',
            "The order with name {cleaned_data['name']} and zip {cleaned_data['zip']}",
            None,
            [cleaned_data['email']],
            fail_silently=False,
        )

有关发送电子邮件的更多信息,请参阅Django 文档中的部分


推荐阅读