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

噢!對不起,這個普通的錯誤哈哈。謝謝你的幫助,和好玩的事實=) –

相關問題