django - 如何在 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)
解决方案
您好,您的解决方案不包含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()
您还可以使用一些与模型形式协同工作的通用视图。
推荐阅读
- slack - 向 Slack 的拼写检查器添加新单词
- python - 根据字符串在每个循环中调用不同的变量
- javascript - MongoDB搜索不返回相同字符串的文档
- c# - UIImagePickerController 出现“尝试呈现其视图不在窗口层次结构中的 Xamarin_Forms_Platform_iOS_ModalWrapper”错误
- javascript - 如何在 JS 中循环使用 ID 名称?
- branch - 为什么发布分支是从开发分支而不是主分支?
- angular - 如果将其名称作为字符串,如何在打字稿中运行自定义函数?
- elasticsearch-5 - Elasticsearch HTTP 500 错误 {"message":null}
- c# - 识别控制器中“神秘”的行动调用索引方法的问题
- api - 一对多插入错误的表