1

このようなフォームセットを作成しました。

class MixedObsCollsForm(forms.Form):

    def __init__(self, *args, **kwargs):
        project_id = kwargs.pop('project_id')
        super(MixedObsCollsForm, self).__init__(*args, **kwargs)
        project = get_object_or_404(Project, pk=project_id)
        self.fields['photos_upload'] = forms.ImageField(label="Photos", required=False)

    taxon = forms.CharField(max_length=80, required=False)
    growth_form = forms.ChoiceField(choices = growthFormChoice, required=False)
    height = forms.DecimalField(max_value=99, min_value=0, decimal_places=2, required=True)
    density = forms.IntegerField(max_value=100, min_value=1, required=False)

そして、クラスを使用してすべての処理を処理するビューに表示する奇妙な方法があります。でも、こんなん...

class ObservationFormView(object):    

    def __init__(self, request=None, project_id=None, observation_id=None):

        self.request = request
        self.ObservationFormSet = formset_factory(form=MixedObsCollsForm, extra=5)
        self.ObservationFormSet.form = staticmethod(curry(MixedObsCollsForm, project_id=project_id)) 
        self.project = get_object_or_404(Project, pk=project_id)



        self.user = request.user

        self.use_type = 'create'
        self.formset = self.ObservationFormSet(self.request.POST or None)


    def isValid(self):
        return self.formset.is_valid() & self.locationForm.is_valid()

    def render(self):
        return render(self.request, 'observation_form.html', {'use_type': self.use_type, 'formset': self.formset, 'locationForm':self.locationForm, 'project_photos': self.project.photos.all(),})

    def processForm(self):     

        for form in self.formset:
            if form.is_valid() == True:
                if form.cleaned_data['is_collection'] == True:
                    collection = self.getOrMakeCollection(form.cleaned_data, self.locationForm.cleaned_data['location'], False)
                if form.cleaned_data['is_collection'] == False:
                    collection = self.getOrMakeCollection(form.cleaned_data, self.locationForm.cleaned_data['location'], True)

                observation = self.saveObservation(form.cleaned_data, self.locationForm.cleaned_data['location'], collection)


        return observation

問題は、このフォームをビューでレンダリングすると、空のフォームセット内のフォームが検証されないことです。「このフィールドは必須です」と報告する。すべての高さフィールドの横。空のものでさえ。

空のフォームは常に検証に合格する必要があるというのが私の理解でした。管理フォームのデータを確認しましたが、問題ないようです。

required を False に変更すると、フォームセットをデータベースに保存しようとすると IntegrityErrors が発生することになります。

4

1 に答える 1

1

私は最終的にそれが何であったかを理解したので、ここではこの問題を抱えている他の人のために、見落としがちです.

質問のコードには含まれていなかったので、誰も提供できる助けはあまりありませんでした。

この行:

growth_form = forms.ChoiceField(choices = growthFormChoice, required=False)

growthFormChoiceこのような選択肢のタプルである変数を使用しました。

growthFormChoice = (('0', 'Select one'),
                    ('T', 'tree'),  
                    ('S', 'shrub'))

このため、デフォルト値では、(意図的に) 変更されていないすべてのフォームに('0':'Select One') a が渡さ0れ、残りのフィールドの検証がトリガーされました。に変更するだけで十分('':'Select One')でした。

于 2013-02-18T15:16:58.723 に答える