【问题标题】:Django class based generic view “CreateView” form errors handling基于 Django 类的通用视图“CreateView”表单错误处理
【发布时间】:2017-11-07 21:37:43
【问题描述】:

我是 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

在我的模板中它工作正常,显示正确的地址列表并通过帖子表单创建它。但是如果用户没有选择地址,则会触发预期的错误NOT NULL constraint failed: checkout_cartconfig.address_id。问题是,CreateView 不应该处理这个错误吗?我究竟做错了什么?如何使用field.errors 刷新页面以向用户显示“必填字段”消息?

【问题讨论】:

  • 空白应该是布尔值blank=False。也许字符串“false”正在解析为truthy,而不是将required标签添加到html中的表单输入中。
  • @Brobin 是的,为这个错误感到羞耻哈哈 =(,谢谢你的回复!

标签: python django django-models django-forms django-class-based-views


【解决方案1】:

blank="false" 的模型设置不正确。它需要是一个布尔值。

address = models.ForeignKey(
    Address,
    verbose_name='Endereço de entrega',
    blank=False
)

关于 Python 的有趣事实:当解析为布尔值时,字符串的计算结果为 true。

>>> bool("false")
True

【讨论】:

  • 哇!对不起这个普通的错误哈哈。感谢您的帮助,以及有趣的事实 =)
猜你喜欢
  • 2015-07-26
  • 2014-01-22
  • 1970-01-01
  • 2016-12-05
  • 2022-01-10
  • 2021-06-26
  • 2017-01-01
  • 2012-12-31
  • 2012-03-29
相关资源
最近更新 更多