Cada valor en request.POST es una lista

Tengo problemas porque cada valor en request.POST está dentro de una lista. Así que cada vez que hago esto:

MyForm(request.POST)

Ninguna de las validaciones pasa porque esperan cadenas y no listas. Y los mensajes de error son de este tipo:

[u'13/04/2000'] is not a valid date

¿Hay alguna configuración o algo que deba cambiar para poder pasar request.POST a un formulario? Realmente no quiero hacer algo como request.POST.get(...) para cada campo.

Bien, aquí está mi formulario:

class FormAddCourse(forms.Form):
    career = choice_field(Career)
    assignature = choice_field(Assignature)
    start_date = forms.DateField(label = spanish('col_name', 'start_date', True),
                                 help_text = "Formato: dd/mm/aaaa")
    end_date = forms.DateField(label = spanish('col_name', 'end_date', True),
                               help_text = "Formato: dd/mm/aaaa")
    day_choices = [('Mo', 'Lunes'), ('Tu', 'Martes'), ('We', 'Miércoles'), ('Th', 'Jueves'),
                   ('Fr', 'Viernes'), ('Sa', 'Sábado'), ('Su', 'Domingo')]
    days = forms.MultipleChoiceField(label = spanish('col_name_plural', 'day', True),
                                     widget = CheckboxSelectMultiple,
                                     choices = day_choices)
    length_choices = (
        ('S', spanish('choices', 'semesterly', True)),
        ('Y', spanish('choices', 'yearly', True)),
        )
    length = forms.ChoiceField(label = spanish('col_name', 'length', True),
                               widget = RadioSelect,
                               choices = length_choices)
    hours = forms.CharField(widget = HiddenInput,
                            max_length = 300,
                            validators=[validate_hours])

Y aquí está mi punto de vista:

def add_course_view(request):
    if request.method == "GET":
        form = FormAddCourse()
        c = {'form': form}
        return render_to_response('crud/courses/add.html', c, RequestContext(request))
    elif request.method == "POST":
        try:
            hours = get_hours(request.POST)
            form_data = {'hours': hours}
            form_data.update(request.POST.copy())
            form = FormAddCourse(form_data)
            if form.is_valid():           # This thing never passes
                career = form.cleaned_data['career']
                assignature = form.cleaned_data['assignature']
                start_date = form.cleaned_data['start_date']
                end_date = form.cleaned_data['end_date']
                days = form.cleaned_data['days']
                length = form.cleaned_data['length']
                hours = form.cleaned_data['hours']
                credits = calculate_credits(valid_hours)
                # alter database
                # course = Course.objects.create(career=career, assignature=assignature, start_date=start_date, end_date=end_date, days=days, length=length, credits=credits, hours=hours)
                if u'submit_another' in request.POST:
                    # Submit and add another
                    messages.add_message(request, messages.SUCCESS, u"El curso ha sido guardado. Agregue otro.")
                    return redirect('crud.views.add_course_view')
                else:
                    # Submit and end
                    messages.add_message(request, messages.SUCCESS, u"El curso ha sido guardado.")
                    return redirect('ssys.views.homepage')
        except FieldError as e:
            # return user to complete form with fields already filled
            pass

En cuanto a las funciones de validación, la única personalizada es validate_hours, que en realidad es la única que pasa porque agrego las horas manualmente a form_data.

Ok, descubrí cuál es el problema, puedo agregar a request.POST.copy () pero no puedo agregarlo a un diccionario. Gracias por toda tu ayuda.

preguntado el 12 de junio de 12 a las 16:06

Claramente estás haciendo algo extraño aquí. No debería acceder a los valores request.POST en absoluto. Por favor, publique las funciones de validación al menos. -

2 Respuestas

request.POST es un QueryDict, que es una clase similar a un diccionario pero no un diccionario.

Tu podrías intentar

form_data = request.POST.copy()
form_data.update({'hours': hours})

#instead of
form_data = {'hours': hours}
form_data.update(request.POST.copy())

Pero, de acuerdo con su código, el hours se obtiene de request.POST además. Entonces, ¿por qué no simplemente usar el formulario para procesar todos los campos? Si tiene problemas para hacerlo en el formulario o hay alguna consideración lógica especial, podría dejarlo claro en la pregunta.

Respondido el 12 de junio de 12 a las 17:06

Debería instanciar el formulario de la siguiente manera:

form = MyForm(request.POST)
if form.is_valid():
    pass

No se necesita ningún otro código para obtener la validación básica de formularios en Django. Si necesita agregar valores a request.POST luego considere crear campos de entrada ocultos e incluir los valores previstos en el formulario ya.

Respondido el 12 de junio de 12 a las 18:06

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.