对于我公司的惯例,任何验证都必须在表单中进行,而不是在任何Django APP的视图中进行。
我的此代码适用于我的表单,作为常规表单。但我已升级&#34;它是一个&#39; ModelForm&#39;并且这段代码有效,但并没有保存&#34;文件&#34; <娜娜&#39;
的属性 1.-我做错了什么?
2.-以“#”形式进行验证有什么好处? vs&#39; view&#39;?
forms.py
from django import forms
from django.core.exceptions import ObjectDoesNotExist
from django.db import transaction
from nucleo.models.documento import Documento
from nucleo.models.nana import Nana
from nucleo.models.tipo_documento import TipoDocumento
class NanaForm(forms.ModelForm):
class Meta:
model = Nana
fields = ['nombre', 'apellido_paterno', 'apellido_materno', 'fecha_de_nacimiento', 'direccion',
'telefono_o_celular',
'genero', 'foto', 'latitud', 'longitud']
def clean(self):
form_data = self.cleaned_data
try:
tipo_documento = TipoDocumento.objects.get(form_data['tipo_documento'])
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']
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(codigo=documento_codigo, tipo_documento_id=documento_tipo_id)
documento.save()
nana = Nana(documento=documento, **valid_data)
nana.save()
return nana
class DocumentoForm(forms.ModelForm):
class Meta:
model = Documento
fields = ['tipo_documento', 'codigo']
models.py
class TipoDocumento(models.Model):
nombre_corto = models.CharField(blank=False, null=False, max_length=25)
nombre_largo = models.CharField(blank=False, null=False, max_length=100)
tipo_patron = models.IntegerField(blank=False, null=False, choices=TIPO_PATRON)
tipo_contribuyente = models.IntegerField(blank=False, null=False, choices=TIPO_CONTRIBUYENTE)
tipo_longitud = models.IntegerField(blank=False, null=False, choices=TIPO_LONGITUD)
def __str__(self):
return self.nombre_corto
class Documento(models.Model):
def __str__(self):
return self.codigo
tipo_documento = models.ForeignKey(TipoDocumento, on_delete=models.SET_NULL, null=True)
codigo = models.CharField(max_length=25)
class Nana(Usuario):
# secretaria_registradora = models.ForeignKey(Staff)
habilidades = models.ForeignKey(Habilidad, blank=True, null=True)
especialidades = models.ForeignKey(Especialidad, blank=True, null=True)
experiencia_con_mascotas = models.BooleanField(default=False)
foto = models.ImageField(upload_to='nanas_fotos',
default='media/nana-default.png')
# antecedentes_policiales = models.FileField(upload_to='nanas_antecedentes_policiales')
def __str__(self):
return self.nombre
class Usuario(models.Model):
class Meta:
abstract = True
nombre = models.CharField(blank=False, null=False, max_length=200)
apellido_paterno = models.CharField(blank=False, null=False, max_length=100)
apellido_materno = models.CharField(blank=True, null=False, max_length=100)
fecha_de_nacimiento = models.DateField(blank=False, null=False)
documento = models.OneToOneField(Documento, on_delete=models.CASCADE, blank=False, null=True, validators=[validar_documento])
telefono_o_celular = models.CharField(max_length=14)
esta_activo = models.BooleanField(default=False)
genero = models.CharField(blank=False, null=False, choices=GENERO, max_length=1, default='f')
direccion = models.CharField(blank=False, null=False, max_length=160, default='')
latitud = models.CharField(blank=False, null=False, max_length=60, default='')
longitud = models.CharField(blank=False, null=False, max_length=60, default='')
views.py
class RegistroView(View):
def get(self, request):
nana_form = NanaForm()
documento_form = DocumentoForm()
context = {'nana_form': nana_form, 'documento_form': documento_form}
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()
else:
print(nana_form.errors)
return HttpResponseRedirect('/')
这是我在 view.py 之前(在此文件中完成保存过程时):
class RegistroView(View):
def get(self, request):
nana_form = NanaForm()
documento_form = DocumentoForm()
context = {'nana_form': nana_form, 'documento_form': documento_form}
return render(request, 'app_administrador/crear-registro-como-secretaria.html', context)
def post(self, request):
nana_form = NanaForm(request.POST, request.FILES)
documento_form = DocumentoForm(request.POST)
if all((nana_form.is_valid(), documento_form.is_valid())):
documento = documento_form.save()
nana = nana_form.save(commit=False) #Don't save it to the DB. Just store the variable for now.
nana.documento = documento #adding documento to 'Nana' model through NanaForm.
nana.save()
return HttpResponseRedirect('/')