基于 Django class 的通用视图“CreateView”表单错误处理
Django class based generic view “CreateView” form errors handling
我是 CBV 的新手,正在尝试使用通用视图 CreateView
并理解它。
在models.py我有这个型号:
class CartConfig(models.Model):
cart_key = models.CharField(
'Chave do Carrinho', max_length=40, db_index=True
)
PAYMENT_OPTION_CHOICES = (
('cash', 'Dinheiro'),
...
)
payment_option = models.CharField(
'Opção de Pagamento', choices=PAYMENT_OPTION_CHOICES, max_length=20,
default='cash'
)
address = models.ForeignKey(Address, verbose_name='Endereço de entrega',
blank="false"
)
class Meta:
verbose_name = 'Configuração do carrinho'
verbose_name_plural = 'Configurações do carrinho'
def __str__(self):
return 'Cart configs for {}'.format(self.cart_key)
那个模型使用了一个ForeignKey
到Address
,这也是User
模型中的一个ManyToMany
字段。
因此,在我的 views.py 中,我编辑了“地址”字段的查询集以仅处理与当前 User
:
相关的地址
class CartConfigView(CreateView):
model = CartConfig
template_name = 'checkout/cart_config.html'
fields = ['address','payment_option']
success_url = reverse_lazy('index')
def get_context_data(self, **kwargs):
context = super(CartConfigView, self).get_context_data(**kwargs)
context['form'].fields['address'].queryset = get_object_or_404(User, pk=self.request.user.pk).address.all()
context['form'].fields['address'].empty_label = None
return context
在我的模板中它工作正常,显示正确的地址列表并通过 post 表单创建它。但是,如果用户没有 select 地址,则会触发预期的错误 NOT NULL constraint failed: checkout_cartconfig.address_id
。问题是,CreateView
不应该处理这个错误吗?我究竟做错了什么?如何使用 field.errors
刷新页面以向用户显示 "required field" 消息?
您的模型与 blank="false"
的设置不完全正确。它需要是一个布尔值。
address = models.ForeignKey(
Address,
verbose_name='Endereço de entrega',
blank=False
)
关于 Python 的有趣事实:解析为布尔值时,字符串的计算结果为真。
>>> bool("false")
True
我是 CBV 的新手,正在尝试使用通用视图 CreateView
并理解它。
在models.py我有这个型号:
class CartConfig(models.Model):
cart_key = models.CharField(
'Chave do Carrinho', max_length=40, db_index=True
)
PAYMENT_OPTION_CHOICES = (
('cash', 'Dinheiro'),
...
)
payment_option = models.CharField(
'Opção de Pagamento', choices=PAYMENT_OPTION_CHOICES, max_length=20,
default='cash'
)
address = models.ForeignKey(Address, verbose_name='Endereço de entrega',
blank="false"
)
class Meta:
verbose_name = 'Configuração do carrinho'
verbose_name_plural = 'Configurações do carrinho'
def __str__(self):
return 'Cart configs for {}'.format(self.cart_key)
那个模型使用了一个ForeignKey
到Address
,这也是User
模型中的一个ManyToMany
字段。
因此,在我的 views.py 中,我编辑了“地址”字段的查询集以仅处理与当前 User
:
class CartConfigView(CreateView):
model = CartConfig
template_name = 'checkout/cart_config.html'
fields = ['address','payment_option']
success_url = reverse_lazy('index')
def get_context_data(self, **kwargs):
context = super(CartConfigView, self).get_context_data(**kwargs)
context['form'].fields['address'].queryset = get_object_or_404(User, pk=self.request.user.pk).address.all()
context['form'].fields['address'].empty_label = None
return context
在我的模板中它工作正常,显示正确的地址列表并通过 post 表单创建它。但是,如果用户没有 select 地址,则会触发预期的错误 NOT NULL constraint failed: checkout_cartconfig.address_id
。问题是,CreateView
不应该处理这个错误吗?我究竟做错了什么?如何使用 field.errors
刷新页面以向用户显示 "required field" 消息?
您的模型与 blank="false"
的设置不完全正确。它需要是一个布尔值。
address = models.ForeignKey(
Address,
verbose_name='Endereço de entrega',
blank=False
)
关于 Python 的有趣事实:解析为布尔值时,字符串的计算结果为真。
>>> bool("false")
True