Django:提交失败的表单后保留值

时间:2017-12-01 21:44:45

标签: python django

我知道有类似的问题,但我无法完成这项工作。

如何返回包含用户完成值的表单?

现在,它返回带有消息错误的表单,但没有以前的值。

class RegistroView(View):


    ls_tipos_de_documento = TipoDocumento.objects.values_list('id', 'nombre_corto')
    ls_habilidades = Habilidad.objects.values_list('id', 'nombre')
    ls_especialidades = Especialidad.objects.values_list('id', 'nombre')


    def get(self, request):

        nana_form = NanaForm()
        context = {'nana_form': nana_form, 'ls_tipos_de_documento': self.ls_tipos_de_documento, 'ls_especialidades': self.ls_especialidades, 'ls_habilidades': self.ls_habilidades, }
        return render(request, 'app_administrador/crear-registro-como-secretaria.html', context)

    def post(self, request):
        nana_form = NanaForm(request.POST, request.FILES)
        if nana_form.is_valid():
            nana_form.save()
            return HttpResponseRedirect('/') #Success takes visitor to '/'

        else:
            context = {'nana_form': nana_form, 'ls_tipos_de_documento': self.ls_tipos_de_documento, 'ls_especialidades': self.ls_especialidades, 'ls_habilidades': self.ls_habilidades, }
            return render(request, 'app_administrador/crear-registro-como-secretaria.html', context)
        # return HttpResponseRedirect('/')

更新1:以在forms.py

上显示自定义验证

请检查此项以查看自定义验证。

forms.py

class NanaForm(forms.Form):
    nombre = forms.CharField(label='Nombre', max_length=200)
    apellido_paterno = forms.CharField(label='Apellido paterno', max_length=100)
    apellido_materno = forms.CharField(label='Apellido materno', max_length=100)
    fecha_de_nacimiento = forms.DateField(label='Fecha de nacimiento')
    documento = forms.CharField(label='Documento', max_length=60, required=True)
    tipo_documento = forms.CharField(label='Tipo de documento', max_length=100)
    direccion = forms.CharField(label='Dirección', max_length=100)
    telefono_o_celular = forms.CharField(label='Teléfono o celular', max_length=14)
    latitud = forms.CharField(label='Latitud', max_length=100)
    longitud = forms.CharField(label='Longitud', max_length=100)
    genero = forms.CharField(label='Género', max_length=100)
    habilidades = MultipleIntField()
    especialidades = MultipleIntField()

    foto = forms.ImageField(required=False)

    def clean(self):
        form_data = self.cleaned_data
        if 'tipo_documento' in form_data:
            tipo_documento_id = form_data['tipo_documento']
        else:
            return form_data
        try:
            tipo_documento = TipoDocumento.objects.get(id=tipo_documento_id)
            if not tipo_documento.validar_documento(form_data['documento']):
                self._errors["documento"] = ["El documento no cumple el formato."]
                del form_data['documento']
        except ObjectDoesNotExist:
            self._errors["tipo_documento"] = ["No existe el tipo de documento seleccionado."]
            del form_data['tipo_documento']

        lista_habilidades = form_data['habilidades']
        habilidades_encontradas = Habilidad.objects.filter(pk__in=lista_habilidades)
        if len(lista_habilidades) != len(habilidades_encontradas):
            self._errors["habilidades"] = ["No existe"]
            del form_data['habilidades']

        lista_especialidades = form_data['especialidades']
        especialidades_encontradas = Especialidad.objects.filter(pk__in=lista_especialidades)
        if len(lista_especialidades) != len(especialidades_encontradas):
            self._errors["especialidades"] = ["No existe"]
            del form_data['especialidades']

        return form_data

    @transaction.atomic()
    def save(self):
        valid_data = self.cleaned_data
        documento_codigo = valid_data.pop('documento')
        documento_tipo_id = valid_data.pop('tipo_documento')
        documento = Documento.objects.create(codigo=documento_codigo, tipo_documento_id=documento_tipo_id)

        lista_habilidades = valid_data.pop('habilidades')
        lista_especialidades = valid_data.pop('especialidades')

        nana = Nana.objects.create(documento=documento, **valid_data)
        nana.habilidades.add(*lista_habilidades)
        nana.especialidades.add(*lista_especialidades)

        return nana

0 个答案:

没有答案