2017-08-29 10 views
0

no_new_itemが存在する場合、必須のチェックボックスオプションを作成する必要があります。私はmodel.NullBooleanフィールドを使用しています。 Django docsによると、ブールフィールドはチェックボックスウィジェットをレンダリングするが、NullBooleanはSelectをレンダリングするべきである。 NullBooleanへの切り替えの理由は、マイグレーション時のヌル・エラーによるものです。今、私は「はい」と「いいえ」のドロップダウンリストを取得しています。 NullBooleanを持つモデルmodel.Modelsでチェックボックスを作成するにはどうすればよいでしょうか、それとも良い方法がありますか?ModelBaseを使用したDjango Formsetsチェックボックスはデフォルトではなくドロップダウンリストを表示しません。

は(これは私がDjangoのドキュメントについて話したミスと編集です。おかげで@Alasdair)

/models.py

class StoreNightlyReport(models.Model): 
    store_number = models.ForeignKey('Stores', verbose_name='Store Number', max_length=20, null=True) 
    date = models.DateField(null=True) 
    #managers = models.ManyToManyField('auth.User', blank=True, null=True) 

    def __str__(self): 
     return self.store_number.store_number 


class StoreNightlyReportsBase(models.Model): 
    store_nightly_report = models.ForeignKey(StoreNightlyReport) 
    no_new_item = models.NullBooleanField(verbose_name='No New Items', default=True) 
    customer = models.CharField(verbose_name='Customer Name', max_length=20, null=True) 

    class Meta: 
     abstract = True 

/forms.py

class StoreNightlyReportsForm(ModelForm): 
    class Meta: 
     model = StoreNightlyReport 
     widgets = {'date': SelectDateWidget()} 
     exclude =() 

    def __init__(self, *args, **kwargs): 
     user = kwargs.pop('user') 
     super(StoreNightlyReportsForm, self).__init__(*args, **kwargs) 
     if 'store_number' in self.fields: 
      if not user.is_superuser: 
       self.fields['store_number'].queryset = Stores.objects.filter(managers=user) 

/景色.py

class StoresNightlyReportsNewLoansCreate(CreateView): 
    template_name = 'reports/storenightlyreport_form.html' 
    model = StoreNightlyReport 
    form_class = forms.StoreNightlyReportsForm 
    success_url = reverse_lazy('reports:storenightlyreports') 

    def get_form(self, form_class=None): 
     form_class = self.get_form_class() 

     form = form_class(self.request.POST or None, user=self.request.user) 
     self.formsets = {} 
     StoreNightlyReportsNewLoanFormSet = inlineformset_factory(StoreNightlyReport, 
                    StoreNightlyReportsNewLoan, 
                    exclude=[], 
                    extra=1) 
     self.formsets['new_loan'] = StoreNightlyReportsNewLoanFormSet(self.request.POST or None) 

    def get_context_data(self, **kwargs): 
     data = super(StoresNightlyReportsNewLoansCreate, self).get_context_data(**kwargs) 
     data['formset_new_loan'] = self.formsets['new_loan'] 
     return data 


    def get_context_data(self, **kwargs): 
     data = super(StoresNightlyReportsNewLoansCreate, self).get_context_data(**kwargs) 
     #formset_renewal = StoreNightlyReportsRenewalFormSet() 
     data['formset_new_loan'] = self.formsets['new_loan'] 
    return super(StoresNightlyReportsNewLoansCreate, self).form_invalid(form) 

/tem plate.html

{% extends "reports/base.html" %} 
{% load static %} 

{% block body_block %} 


<div class="container-fluid"> 
    <form class="form-inline" action="" method="post"> 
     {% csrf_token %} 
     {{ form }} 

     <table class="table"> 
      {{ formset_new_loan.management_form }} 
      <div> 
      <br><h4><strong>New Loans</strong></h4><br> 
      {% include "reports/formsets.html" with formset=formset_new_loan formset_class_name='new_loan' %} 
      </div> 
     </table> 
+0

あなたはドキュメントに関する誤っている - [ 'NullBooleanField'](https://docs.djangoproject.com/en/1.11/ref/models/fields/#nullbooleanfield)のデフォルトのウィジェットは' NullBooleanSelect'チェックボックスを使用すると、 'False'と' Null'を区別する方法がありません。 – Alasdair

+0

@Alasdair正解ですが、元の意図であったブール値のフィールドを見ていましたが、マイグレーション中にnullエラーを受け取り、モデルに追加できるようにNullBooleanを選択するようにエラーを提案しました。この場合、NullBooleanでこれを行うにはどうすればよいのですか、またはBooleanがチェックボックスを取得する唯一の方法である場合、nullエラーをクリアするにはどうすればよいですか? –

答えて

1

固定

いくつかの考えた後、私は戻ってmodel.Baseに行き、のBooleanFieldタイプにそれを変更し、デフォルト値を追加しました。これにより、移行時にnullエラーがクリアされ、チェックボックスオプションがレンダリングされました。

class StoreNightlyReportsBase(models.Model): 
    store_nightly_report = models.ForeignKey(StoreNightlyReport) 
    no_new_item = models.BooleanField(verbose_name="Check if No New Items", default=False) 
    customer = models.CharField(verbose_name='Customer Name', max_length=20, null=True) 
関連する問題