0

Je suis nouveau à CBV et essaie d'utiliser la vue générique CreateView et le comprendre.classe Django vue générique sur la base « createView » forme la gestion des erreurs

En models.py J'ai ce modèle:

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) 

Ce modèle utilise un ForeignKey-Address, qui est aussi un champ ManyToMany dans le modèle User. Donc, dans mon views.py J'ai effectué le queryset de champ'adress' pour traiter uniquement l'adresse relationed à la User actuelle:

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 

Dans mon modèle, il fonctionne très bien, montrer la liste d'adresses à droite et créez-le aussi à travers le formulaire de publication. Mais si l'utilisateur ne sélectionne pas une adresse, il déclenche l'erreur attendue NOT NULL constraint failed: checkout_cartconfig.address_id. La question est, ne devrait pas le CreateView gère cette erreur? Qu'est-ce que je fais mal? Comment puis-je faire pour rafraîchir la page avec le field.errors pour montrer à l'utilisateur le message "champ requis"?

+0

blanc doit être un booléen 'blank = False'. Peut-être que la chaîne "false" est résolue à la vérité et n'ajoute pas la balise 'required' à l'entrée de formulaire dans le code HTML. – Brobin

+0

@Brobin ouais, honte pour cette erreur hahah = (, merci u pour la réponse! –

Répondre

1

Votre modèle n'est pas configuré correctement avec tout à fait blank="false". Il doit être un booléen. Fait amusant à propos de Python: Lors de la résolution d'un booléen, les chaînes sont évaluées à true.

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

Ow! Désolé pour cette erreur ordinaire hahah. Merci u pour l'aide, et bien amusant fait =) –