我知道有类似的问题,但我无法完成这项工作。
如何返回包含用户完成值的表单?
现在,它返回带有消息错误的表单,但没有以前的值。
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