开发者

django 1.3 forms validation using clean method to retrieve getlist

I have a form with checkboxes, the form functioning well, in my view i can use request.POST.getlist('list') to retrieve the list of values.

At the moment am trying to do some form validation inside the clean method and when i try to use self.cleaned_data['list'] I get the last value. I cannot retrieve the list of items.

Any idea how i could do that?

forms.py

class SelectList_Form(forms.Form):
    list = forms.CharField(required=False)


    def clean(self):
        super(SelectList_Form, self).clean()
        cleaned_data = self.cleaned_data

        try:
            # TODO: list validation
            if cleaned_data['list'].__len__() is 0:
                raise forms.ValidationError(_('Must select at least one of the lists below'),)

            if cleaned_data['list'].__len__() > 1:
                try:
                  开发者_如何学运维  # In here when i print list it only shows me the last value. It doesn't show me the list of values when the box is checked
                    print cleaned_data['list']



                except Main.DoesNotExist:
                    raise Http404

        except forms.ValidationError:
            raise

class Posting_Wizard(FormWizard):

    def render_template(self, request, form, previous_fields, step, context=None):
        if step == 0:
            obj = MainI18n.objects.filter(main__is_active=True, language=request.LANGUAGE_CODE).\
                    exclude(main__parent=None).order_by('main__parent').select_related(depth=1)
            category_choices=dict(['%s,%s' % (i.main.slug, i.main.parent.slug), '%s - %s' % (i.main.parent,i.label)] for i in obj)

            form.fields['categories'] = forms.CharField(widget=forms.RadioSelect(choices=category_choices.items()))


    if step == 1:
        category = request.POST.get('0-categories')

        pobj  = Main.objects.filter(slug=category.split(',')[1], parent=None).get()
        cobj =  Main.objects.filter(slug=category.split(',')[0], parent=pobj.id).get()
        lobj =  ListI18n.objects.filter(list__is_active=True, language=request.LANGUAGE_CODE, list__main__slug=category.split(',')[0], list__main__parent=pobj.id).select_related()

        list_choices = dict([i.id, i.title] for i in lobj)

        if cobj.mainproperties.relation == 'M':
           # Here i generate the checkboxes
            form.fields['list']=forms.CharField(widget=forms.CheckboxSelectMultiple(choices=list_choices.items()),label="Pick the list",)
        else:
            form.fields['list']=forms.CharField(widget=forms.RadioSelect(choices=list_choices.items()),label="Pick the list",)


    return super(Posting_Wizard, self).render_template(request, form, previous_fields, step, context)


def done(self, request, form_list):
    return HttpResponseRedirect(reverse('accounts-registration-wizard-done'))

def get_template(self, step):
    return 'listing/post/wizard/wizard_%s.html' % step


First, there are a number of basic Python errors here. There is almost never a need to access the double-underscore functions - they are internal implementation details. Always use the normal len() function instead. And, never use is for comparisons: it's for identity, so should only be used with things you know have the same identity, which basically just means None. So your code should read:

if len(cleaned_data['list']) == 0:

etc.

Now, secondly, I don't understand why you think there could ever be more than one 'element' in list. You've defined it as a CharField, which is a single field containing many characters. Your len is testing the number of characters entered into that field, not the number of fields, however you think you've defined them.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜