首页 > 解决方案 > 如何在 Django 中获取数据并发布到数据库

问题描述

我创建了一个表单并希望将这些数据发布到数据库,但提交后没有错误并且没有数据建立。

我创建的模型:

class BillingAddress(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, blank=True, null=True)
street_address = models.CharField(max_length=100)
apartment_address = models.CharField(max_length=100)
district = models.CharField(
    max_length=2,
)

def __str__(self):
    return self.user.username

我的项目中的表单.py

class CheckOutForm(forms.Form):
street_address = forms.CharField(widget=forms.TextInput())
apartment_address = forms.CharField(required=False)
district = forms.ChoiceField(widget=forms.Select(attrs={'class': 'custom-select d-block w-100',}), 
choices=DISTRICT_CHOICES,)
same_billing_address = forms.BooleanField(widget=forms.CheckboxInput())
save_info = forms.BooleanField(widget=forms.CheckboxInput())
payment = forms.ChoiceField(widget=forms.RadioSelect, choices=PAYMENT_CHOICES)

html代码:

<form method="POST" class="card-body">
          {% csrf_token %}

          <h3>Shipping address</h3>

          <div class='hideable_shipping_form'>

            <div class="md-form mb-5">
                <label for="street_address" class="">Address</label>
                {{ form.street_address }}.....

视图.py。我想我可能在这里错了,但我想不通

def checkout(request):
form = CheckOutForm(request.POST or None)
if request.method == 'POST':
        street_address = form.cleaned_data.get('street_address')
        apartment_address = form.cleaned_data.get('apartment_address')
        district = form.cleaned_data.get('district')
        same_billing_address = form.cleaned_data.get('same_billing_address')
        save_info = form.cleaned_data.get('save_info')
        payment = form.cleaned_data.get('payment')
        billing_address = BillingAddress(
            user=request.user,
            street_address=street_address,
            apartment_address=apartment_address,
            district=district,
        )
        billing_address.save()
        return redirect('checkout')
else:
    form = CheckOutForm()
context = {
    'form': form
}
return render(request, 'product/checkout.html', context)

标签: djangodjango-modelsdjango-formsdjango-views

解决方案


您好,您的解决方案不包含is_valid表单方法调用,这意味着您的表单cleaned_data或未errors填写,这就是为什么您的模型实例没有任何反应。

要解决这种情况,您可以is_valid在从cleaned_data. 如果表单中的数据无效,您可以查看发送了哪些错误数据并在响应时呈现它。

您还可以使用表单ModelForm的基类来提供基于模型的表单生成:

from django import forms

class BillingAddressForm(forms.ModelForm):
    class Meta:
        model = BillingAddress
        fields = ['street_address', 'apartment_address', 'district']

如果您需要一些额外的字段进行数据验证,您可以将其声明为简单的 django 表单字段并将其附加到模型元的字段属性中:

from django import forms
    
class BillingAddressForm(forms.ModelForm):
    same_billing_address = forms.BooleanField(widget=forms.CheckboxInput())

    class Meta:
        model = BillingAddress
        fields = ['street_address', 'apartment_address', 'district', 'same_billing_address']

表格准备好后,您只需调用is_valid方法:

form = BillingAddressForm(request.POST)
form.is_valid()

您还可以使用一些与模型形式协同工作的通用视图。

请访问表单和字段验证从模型创建表单以获取更多信息。


推荐阅读