2012-09-04 6 views
1

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?

+1

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. –

+0

Fixé. Supprimé la période. – Alex

Répondre

0

Vous ne transmettez pas le paramètre name_list lorsque vous réinstallez le formulaire sur POST. Le champ n'est donc pas créé car if name_list est False.

+0

Soit cela n'a pas fonctionné ou je manque quelque chose d'évident. – Alex

+0

Pouvez-vous montrer exactement ce que vous avez maintenant? La chose est, le code actuel que vous avez affiché ne sera même pas créer le champ de cases à cocher en premier lieu, puisque vous n'êtes pas passer 'name_list' comme kwarg. –

+0

Merci @Daniel. Le problème était en passant la variable name_list car il était en cours de définition hors de la portée de la fonction. Surcharge de portée en faisant name_list une valeur dans un dict. – Alex

Questions connexes