Проверка форм django 1.3 с использованием метода clean для получения getlist - PullRequest
0 голосов
/ 02 сентября 2011

У меня есть форма с флажками, форма работает хорошо, на мой взгляд, я могу использовать request.POST.getlist ('list'), чтобы получить список значений.

В данный момент я пытаюсь выполнить некоторую проверку формы внутри метода clean, и когда я пытаюсь использовать self.cleaned_data ['list'], я получаю последнее значение.Я не могу получить список предметов.

Есть идеи, как мне это сделать?

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

1 Ответ

0 голосов
/ 02 сентября 2011

Во-первых, здесь есть ряд основных ошибок Python.Почти никогда не требуется доступ к функциям двойного подчеркивания - они являются внутренними деталями реализации.Вместо этого всегда используйте обычную функцию len().И никогда не используйте is для сравнений: это для идентичности, поэтому следует использовать только с вещами, которые, как вы знаете, имеют одинаковую идентичность, что в основном означает просто None.Итак, ваш код должен выглядеть так:

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

и т. Д.

Теперь, во-вторых, я не понимаю, почему вы думаете, что в list может быть больше одного «элемента».Вы определили его как CharField, которое представляет собой одно поле, содержащее много символов.Ваш len проверяет количество символов, введенных в это поле, а не количество полей, как вы думаете, вы их определили.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...