基于 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)

那个模型使用了一个ForeignKeyAddress,这也是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