0

私はdjangoが初めてで、フォームのクラスベースのビューを書いています。問題は、このフォームがうまく表示されることですが、投稿するとフォームが無効になります。

デフォルトのバリデーターがフォームを検証するために何をすべきかわかりません。フォームには 2 つのフィールドがあります。1 つは選択肢フィールドで、その選択肢はログイン ユーザーに基づいて動的に設定されます。もう 1 つは CharField です。CharField はフリー テキストであり、ChoiceField はユーザーのデータに基づくため、検証の必要はありません。

フォーム.py

class HomeForm(forms.Form):
    phones= forms.ChoiceField(label='Select phone', choices = (), required=True)
    message = forms.CharField(max_length=10, required=True)

    def __init__(self, user, *args, **kwargs):
        super(HomeForm, self).__init__(*args, **kwargs)
        print >> sys.stderr, 'form init'

        self.fields['phones'].choices = [(ids.id, ids.phone_model.short_name) for ids in GCM_RegId.objects.filter(user=user)]

    def process(self, user):
        cd = self.cleaned_data
        regid_id = cd['phones'].value
        gcm_regid = GCM_RegId.objects.filter(id=regid_id)

ビュー.py

class HomeView(FormView):
    template_name = "home.html"
    form_class = HomeForm
    success_url = 'home'

    def post(self, request, *args, **kwargs):
        form_class = self.get_form_class()
        form = self.get_form(form_class)

        if(form.is_bound):
            print >> sys.stderr, "Form is Bound"
        else:
            print >> sys.stderr, "Form is NOT Bound"

        if form.is_valid():
            print >> sys.stderr, "Form Valid"
            return self.form_valid(form)
        else:
            print >> sys.stderr, "Form NOT Valid"
            return self.form_invalid(form, **kwargs)       

    def get_form(self, form_class):
        form = HomeForm(self.request.user, {})
        return form

    def form_valid(self, form):
        form.process(self.request.user)
        print >> sys.stderr, "RegIdSubmitView form_valid"
        return super(HomeView, self).form_valid(form)   
4

1 に答える 1

3

問題は、フォーム インスタンスを作成するときに request.POST データをフォーム クラスに渡すのを忘れていることだと思います。get_form メソッドは次のようになります。

def get_form(self, form_class):
    form = HomeForm(self.request.user, data=self.request.POST)
    return form

または、 get_form のより良い方法は次のとおりだと思います。

def get_form(self, form_class):
    return form_class(self.request.user, **self.get_form_kwargs()

django.views.generic.edit.FormMixin の get_form_kwargs メソッドのソース コードを確認すると、リクエストの PUT/POST データとファイルが自動的に処理されます。

于 2012-08-02T06:31:25.837 に答える