0

私はCBVを初めて使用しており、汎用ビューCreateViewを使用しようとしています。モデルはまた、UserモデルでManyToMany分野である、AddressからForeignKeyを使用していますDjangoクラスベースの汎用ビュー "CreateView"フォームのエラー処理

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) 

こと:

models.pyでは、私は、このモデルを持っています。 だから、私のviews.pyに私は、現在のUserにrelationedアドレスのみを処理するために'adress'フィールドのクエリセットを編集した:私のテンプレートで

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

ブランクは、「空白= False」のブール値でなければなりません。おそらく、文字列 "false"は真実に解決され、HTMLのフォーム入力に 'required'タグを追加しないでしょう。 – Brobin

+0

@Brobinええ、この間違いのために恥ずかしいhahah =(、返信のためにuをありがとう! –

答えて

1

お使いのモデルはblank="false"で正しく設定されていません。ブール値である必要があります。

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

Pythonについての面白い点:ブール値に解決すると、文字列はtrueに評価されます。

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

Ow!この普通の間違いhahahのために申し訳ありません。 –

関連する問題