从视图

时间:2017-11-25 07:03:58

标签: django django-models django-forms django-views

我有一个FormView,我想从中进行一些表单处理。

form_valid()我试图获取提交的表单值以便实例化不同的对象。

但是,当我收到form.cleaned_data时,我会收到{'form field name' : 'choice label'}的字典 我想获得与选择标签相对应的值。

这是FormView - get_form_kwargs位很容易将自定义选项传递给视图:

class RequestView(FormView):
    form_class = RequestForm
    template_name = 'profile/request.html'
    success_url = '/'

    def get_form_kwargs(self, *args, **kwargs):
        requester_obj = Profile.objects.get(
            user__username=self.request.user)
        accepter_obj = Profile.objects.get(
            user__username=self.kwargs.get('username'))

        r_favorite_set = requester_obj.get_favorite()
        a_favorite_set = accepter_obj.get_favorite()

        kwargs = super().get_form_kwargs()

        kwargs['your_favorite'] = r_favorite_set
        kwargs['their_favorite'] = a_favorite_set

        return kwargs

    def form_valid(self, form):
        super(RequestView, self).form_valid(form)

        # I've tried get_FOO_display() extra instance method
        print(form.get_your_favorite_display())

        # The following will return the choice label
        print(form.cleaned_data.get('your_favorite'))

        Favorites.objects.create(#need form choice selections)

        return redirect(self.get_success_url())  

代码说明:在form_valid内,我希望使用提交的表单中的选择创建一个不同的对象。

那么我如何获得提交的选择而不是标签?这甚至是适当的地方吗?

编辑:表格:

class RequestForm(forms.Form):
    your_favorite = forms.ChoiceField(
        choices=[],
        widget=RadioSelect,
        required=True,
        label="What would you like to exchange?"  
    )
    their_favorite = forms.ChoiceField(
        widget=RadioSelect,
        required=False,
    )

    def __init__(self, *args, **kwargs):
        your_choices = kwargs.pop('your_favorite')
        their_choices = kwargs.pop('their_favorite')

        super().__init__(*args, **kwargs)

        self.fields['your_favorite'].choices = your_choices
        self.fields['their_favorite'].choices = their_choices   

edit2:

def get_favorite(self):
        return (('a', self.fave1), ('b', self.fave2), ('c', self.fave3))   

edit3:

...所以我可以一直这样做。

def get_favorite(self):
        return ((self.fave1, self.fave1), (self.fave2, self.fave2), (self.fave3, self.fave3))   

但是这会在表单中引起一些非常时髦的行为。由于某种原因,这会导致默认情况下选择无线电,并对表单视图发出每个GET请求。如果所有选项都是"无",则选择要选择的第三个选项;如果只有第一个选项是"无",则将选择第一个选项。 无论如何,这可能是一个单独帖子的问题。

0 个答案:

没有答案