0

これは私のforms.pyです

CHOICES = []
class salDeptChartForm(forms.Form):
    company = forms.CharField(max_length=2,label = 'Firma',help_text='A valid email address, please.')
    date_validfrom = forms.DateField(label = 'Bu Tarihten',required=False)
    date_validuntil = forms.DateField(label = 'Bu Tarihe Kadar',required=False)
    saldept = forms.MultipleChoiceField(label = 'Satış Departmanları',choices=CHOICES,    widget=forms.CheckboxSelectMultiple())

ここで、ビューの選択肢をオーバーライドします。

    form = salDeptChartForm(initial={'company':'01'})
    saldeptlist = saleinstance.fetchSalDept()
    form.fields['saldept'].choices = saldeptlist <this is where I override>

オプションの 1 つを選択すると問題が発生します。フォームは検証されません。

Select a valid choice. * is not one of the available choices.

ビューの選択肢をオーバーライドしても、djangoは最初に作成した以前の選択肢をチェックしていると思います。正しいhtml出力が得られます。

これを克服する方法は?どうも

完全なビューコードがあります。フォームは取得用と投稿用の 2 回開始されますが、それが最善かどうかはわかりません。

def salDept(request):
    member_id = request.session['member_id']
    saleinstance = sale(member_id)
    chartinstance = charts(member_id)
    if request.method == 'GET':
        form = salDeptChartForm(initial={'company':'01'})  <first init>
        saldeptlist = saleinstance.fetchSalDept()  <its a list>
        form.fields['saldept'].choices = saldeptlist  <override choices>
        print 'get worked'
        return render(request, 'chart/sale/salDept.html',locals())
    if request.method == 'POST':
        form = salDeptChartForm(request.POST) <second init>
        print 'post worked'
        if form.is_valid(): <fails>
            print 'valid'
            company = form.cleaned_data['company']
            vfr = form.cleaned_data['date_validfrom']
            vun = form.cleaned_data['date_validuntil']
            validfrom = formatDate(vfr)
            validuntil = formatDate(vun)
            selectedSalDepts = request.POST.getlist('saldept')
        else:
            print 'not valid'
            print form.errors
        resultdict = chartinstance.salesBySaldept(company,selectedSalDepts,validfrom, validuntil)
        form = salDeptChartForm(initial={'company':company,'date_validfrom':request.POST['date_validfrom'], 'date_validuntil':request.POST['date_validuntil']})
        domcache = 'true'
        return render(request, 'chart/sale/salDept.html',locals())
4

2 に答える 2

2

これを行うには、フォームのinit () をオーバーライドする必要があります。

class SomeForm(forms.Form):
    email       = forms.EmailField(label=(u'Email Address'))
    users       = forms.MultipleChoiceField(choices=[(x, x) for x in User.objects.all()]
)

    def __init__(self, *args, **kwargs):
        user = kwargs.pop('user', None)
        super(SomeForm, self).__init__(*args, **kwargs)
            self.fields['users'].choices = [(x, x) for x in User.objects.filter(name__contains='Patel')]


    def clean(self):
        return self.cleaned_datas

ここの行番号 (3) で、考えられるすべての選択肢を提供し、 initで選択肢をフィルタリングしたことがわかります。Django は前者から送信されたリクエストを検証し、後者からの選択肢を表示するため、これは重要です。

于 2012-11-29T13:57:50.950 に答える
0

メソッドの選択肢を上書きするだけなので、検証は失敗しますGET。に対しては何もしないPOSTので、Django が知る限り、 に対して有効な選択肢はありませんPOST。に選択肢を追加POSTすると、問題が解決するはずです。

于 2012-11-12T02:01:40.053 に答える