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()
}