0

我是CBV的新手,我试图使用通用视图CreateView并理解它。基于Django类的通用视图“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我编辑'adress'字段的查询集处理只有relationed到当前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刷新页面以向用户显示“必填字段”消息?

+0

blank应该是一个布尔型的'blank = False'。也许字符串“false”解决了truthy问题,而不是在html中的表单输入中添加'required'标签。 – Brobin

+0

@Brobin是的,为这个错误感到羞耻hahah =(,谢谢你的回复! –

回答

1

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

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

关于Python的有趣事实:当解析为布尔值时,字符串评估为true。

>>> bool("false") 
True 
+0

噢!对不起,这个普通的错误哈哈。谢谢你的帮助,和好玩的事实=) –

相关问题