Django:覆盖ModelForm上的保存方法,该方法继承另一个ModelForm

时间:2017-11-27 22:33:10

标签: python django

对于我公司的惯例,任何验证都必须在表单中进行,而不是在任何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('/')

0 个答案:

没有答案