'FileField' object has no attribute 'is_hidden' when creating form to upload documents

1

I get this error in the template that renders my view, in which I am testing the FileField field in the model.

{% extends 'base.html' %}
{% block Tilte %}
    Registrar Solictud a la Convocatoria
{% endblock Tilte %}

{% block navbar %}
{% endblock navbar %}

{% block content %}
    <form action="" enctype="multipart/form-data" method="POST">
        {% csrf_token %}
        {{ form.as_p }}  <!--aqui sale el error -->
        <input class="btn btn-default form-control" type="submit" value="Registrar Solicitud">
    </form>
{% endblock content %}

my models are:

apps/solicitud/models.py

def upload_location(instance, filename):
    if instance.curp:
        filename = "%s.pdf" % instance.curp

    if instance.acta_nacimiento:
        filename = "acta_%s.pdf" % instance.curp

    if instance.comprobante_domicilio:
        filename = "domicilio_%s.pdf" % instance.curp

    if instance.titulo:
        filename = "titulo_%s.pdf" % instance.curp

    return "%s/%s" % (instance.id, filename)


class Solicitud(models.Model):
    nombre = models.CharField(max_length=50)
    apellidos = models.CharField(max_length=70)
    email = models.EmailField(unique=True)

    sexo = models.CharField(max_length=9, choices=SEXO_CHOICES)
    fecha_nacimiento = models.DateField()
    curp = models.CharField(max_length=18, unique=True)
    #curpFoto = models.FileField(upload_to=upload_location, null=True, blank=True)

    pais_origen = models.CharField(max_length=30, default="México")
    lugar_nacimiento = models.CharField(max_length=100)
    #acta_nacimiento = models.FileField(upload_to=upload_location, null=True, blank=True)

    domicilio = models.CharField(max_length=120)
    codigo_postal = models.CharField(max_length=5)
    #comprobante_domicilio = models.FileField(upload_to=upload_location, null=True, blank=True)
    telefono = models.CharField(max_length=20)

    escuela_procedencia = models.CharField(max_length=50)
    programa_solicitado = models.CharField(max_length=50, choices=PROGRAMA_SOLICITADO_CHOICES, default=MAS_ADMIN)
    titulado = models.CharField(max_length=11, choices=ESTADO_TITULACION_CHOICES, default=YA_TITULADO)
    titulacion_creditos = models.CharField(max_length=2, choices=TITULACION_CREDITOS_CHOICES, default=NO)
    #titulo = models.FileField(upload_to=upload_location, null=True, blank=True)

    def __unicode__(self):
        return u'Solicitud id: {}'.format(self.id)


class Documentacion(models.Model):
    candidato = models.OneToOneField(Solicitud, null=False, blank=False, on_delete=models.CASCADE)
    curp = models.FileField(upload_to=upload_location, null=True, blank=True)

I have commented on the fields of the first model to add it until the upload part works with the model below

My URLS

apps/solicitud/urls.py

# -*- coding: utf-8 -*-
from django.conf.urls import url
from django.conf import settings
from django.conf.urls.static import static

import views

app_name = 'solicitud'

urlpatterns = [
    url(r'^$', views.home, name='home'),
    url(r'registrar_solicitud/$', views.AddSolicitud.as_view(), name='datos_candidato'),
    url(r'documentacion/$', views.add_documentacion, name='documentos'),
]

if settings.DEBUG:
    urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

Here are my views

apps/solicitud/views.py

def add_documentacion(request):
    form = DocumentacionForm(request.POST or None, request.FILES or None)
    #aqui no sé porque me dice error de que solo recibe un parámetro y que le estoy dando 3

    if form.is_valid():
        form.save()

    context = {
       "form": form
    }

    return render(request, "solicitud/solicitud_form.html", context)

I also added the variables MEDIA, MEDIA_URL, STATIC and STATIC_URL to projec / settings.py

project/settings.py

STATIC_URL = '/static/'
STATICFILES_DIRS = (os.path.join(BASE_DIR, 'static'),)

MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

In my forms.py the fields that I want to add to the request model are commented, I have done the test with a single field

apps/solicitud/forms.py

# -*- coding: utf-8 -*-
from django import forms

from models import Solicitud, Documentacion


class SolicitudForm(forms.ModelForm):
    class Meta:
        model = Solicitud
        fields = [
            'nombre',
            'apellidos',
            'email',

            'fecha_nacimiento',
            #'acta_nacimiento',
            'sexo',
            'curp',
            #'curpFoto',
            'pais_origen',
            'lugar_nacimiento',
            'domicilio',
            #'comprobante_domicilio',
            'codigo_postal',
            'telefono',

            'escuela_procedencia',
            'programa_solicitado',
            'titulado',
            'titulacion_creditos',
            #'titulo',
        ]

        labels = {
            'nombre': 'Nombre(s)',
            'apellidos': 'Apellidos',
            'email': u'Correo Electrónico',
            'fecha_nacimiento': 'Fecha de Nacimiento',
            #'acta_nacimiento': 'Acta de nacimiento',
            'sexo': 'Sexo',
            'curp': 'CURP',
            #'curpFoto': 'Comprobante de la CURP',
            'pais_origen': 'Pais de origen',
            'lugar_nacimiento': 'Lugar de Nacimiento',
            'domicilio': 'Domicilio',
            'codigo_postal': u'Código Postal',
            #'comprobante_domicilio': ' Comprobante de domicilio',
            'telefono': u'Teléfono',

            'escuela_procedencia': 'Escuela de Procedencia',
            'programa_solicitado': 'Programa de Estudios Solicitado',
            'titulado': u'Estado de su Titulación',
            'titulacion_creditos': u'Titulación por créditos de Posgrado',
            #'titulo': u'Título de licenciatura',
        }

        widgets = {
            'nombre': forms.TextInput(attrs={'class': 'form-control'}),
            'apellidos': forms.TextInput(attrs={'class': 'form-control'}),
            'email': forms.TextInput(attrs={'class': 'form-control'}),

            'fecha_nacimiento': forms.DateInput(attrs={'type': 'date', 'class': 'form-control'}),
            # 'fecha_nacimiento': forms.TextInput(attrs={'class': 'form-control'}),

            # 'acta_nacimiento': forms.FileField(),

            'sexo': forms.Select(attrs={'class': 'form-control'}),
            'curp': forms.TextInput(attrs={'class': 'form-control'}),

            # 'curpFoto': forms.FileField(),

            'pais_origen': forms.TextInput(attrs={'class': 'form-control'}),
            'lugar_nacimiento': forms.TextInput(attrs={'class': 'form-control'}),
            'domicilio': forms.TextInput(attrs={'class': 'form-control'}),
            'codigo_postal': forms.TextInput(attrs={'class': 'form-control'}),

            # 'comprobante_domicilio': forms.FileField(),

            'telefono': forms.TextInput(attrs={'class': 'form-control'}),

            'escuela_procedencia': forms.TextInput(attrs={'class': 'form-control'}),
            'programa_solicitado': forms.Select(attrs={'class': 'form-control'}),
            'titulado': forms.Select(attrs={'class': 'form-control'}),
            'titulacion_creditos': forms.Select(attrs={'class': 'form-control'}),

            # 'titulo': forms.FileField(),

        }


class DocumentacionForm(forms.ModelForm):
    class Meta:
        model = Documentacion
        fields = ["curp"]

        labels = {
            "curp": u"curp"
        }

        widgets = {
            "curp": forms.FileField()
        }
    
asked by Kuroi 01.03.2018 в 17:36
source

1 answer

1

The error is in this part of your code:

class DocumentacionForm(forms.ModelForm):
    class Meta:
        model = Documentacion
        fields = ["curp"]

        labels = {
            "curp": u"curp"
        }

        widgets = {
            "curp": forms.FileField()
        }

FileField is not a widget (like Select or TextInput ), it is a field. Remove or comment on that part and your form should work:

class DocumentacionForm(forms.ModelForm):
    class Meta:
        model = Documentacion
        fields = ["curp"]

        labels = {
            "curp": u"curp"
        }

        #widgets = {
        #    "curp": forms.FileField()
        #}

Keep in mind that you only have to use widgets within Meta when you want to replace the widget that Django uses by default, or when you want to add some CSS class for styles, for example.

Take a look at the fields and widgets so you can learn to differentiate them without confusing them:

answered by 01.03.2018 / 19:26
source