我有一个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请求。如果所有选项都是"无",则选择要选择的第三个选项;如果只有第一个选项是"无",则将选择第一个选项。 无论如何,这可能是一个单独帖子的问题。