je tentais de générer dynamiquement des champs comme indiqué dans http://jacobian.org/writing/dynamic-form-generation/. Mon cas diffère légèrement en ce que je cherche à utiliser multiplechoicefield qui est créé dynamiquement. Voilà ce que je suis venu avec ...valeur manquante d'accès à form.cleaned_data
views.py
def browseget(request):
success = False
if request.method == 'POST':
list_form = ListForm(request.POST)
if list_form.is_valid():
success = True
path = list_form.cleaned_data['path']
minimum_size = list_form.cleaned_data['minimum_size']
follow_link = list_form.cleaned_data['follow_link']
checkboxes = list_form.cleaned_data['checkboxes']
....do something
else:
list_form = ListForm(name_list)
ctx = {'success': success, 'list_form': list_form, 'path': path, 'minimum_size': minimum_size}
return render_to_response('photoget/browseget.html', ctx, context_instance=RequestContext(request))
forms.py
class ListForm(forms.Form):
path = forms.CharField(required=False)
minimum_size = forms.ChoiceField(choices=size_choices)
follow_link = forms.BooleanField(required=False, initial=True)
def __init__(self, *args, **kwargs):
name_list = kwargs.pop('name_list', None)
super(ListForm, self).__init__(*args, **kwargs)
print 'Received data:', self.data
if name_list:
name_choices = [(u, u) for u in name_list]
self.fields['checkboxes'] = forms.MultipleChoiceField(required=False, label='Select Name(s):', widget=forms.CheckboxSelectMultiple(), choices=name_choices)
def clean_path(self):
cd = self.cleaned_data
path = cd.get('path')
if path == '': path = None
return path
def clean_minimum_size(self):
cd = self.cleaned_data
minimum_size = cd.get('minimum_size')
if minimum_size is None: minimum_size = 0
return int(minimum_size)
La forme génère et affiche parfaitement ... jusqu'à ce que je posterai des données. Le champ 'checkboxes' n'apparaît pas dans list_form.cleaned_data.items() alors qu'il apparaît dans self.data. Comme c'est le cas casse avec une exception KeyError. Donc, je demande, comment puis-je accéder aux données des cases à cocher?
Vous avez une période dans votre code entre '' cleaned_data' et [cases] '. Cela conduira à une erreur de syntaxe qui empêchera le code post-conditionnel de s'exécuter avec succès. –
Fixé. Supprimé la période. – Alex