I have a model, which has 3 ImageField. When loading a new entry into the database, it may have some blank images, so the value is None. When the client request the model data entry, I get in the server side:
ValueError: The ‘picture2’ attribute has no file associated with it.
The problem is in the imageField.read() when there is not a file to read. How can I solve it without check with if statment if there is or not a file?
class item (models.Model):
certificate=models.ImageField(default=None)
provider = models.ForeignKey(serviceProvider, on_delete=models.CASCADE, null=True)
radius = models.FloatField(default=None)
description= models.TextField(blank = True)
hour_init = models.TimeField()
hour_end = models.TimeField()
picture1=models.ImageField(default=None, blank=True)
picture2=models.ImageField(default=None,blank=True)
picture3=models.ImageField(default=None, blank=True)
This is the view.py function:
def addRubro (request):
if request.method == 'POST':
if request.POST.get("tipo")=="2":
proveedores=serviceProvider.objects.filter(user=request.POST.get("user"))
if not proveedores:
return HttpResponse("Bad")
else:
rubros=item.objects.filter(provider=proveedores.first())
if len(rubros)<2:
new = item()
new.provider=proveedores.first()
new.radius=request.POST.get("radius")
new.description=request.POST.get("description")
new.hour_init=request.POST.get("hour_init")
new.hour_end=request.POST.get("hour_end")
new.certificate=request.FILES.get("certificate")
new.picture1=request.FILES.get("picture1")
new.picture2=request.FILES.get("picture2")
new.picture3=request.FILES.get("picture3")
new.save()
return HttpResponse("Item loaded")
I have a model, which has 3 ImageField. When loading a new entry into the database, it may have some blank images, so the value is None. When the client request the model data entry, I get in the server side:
ValueError: The ‘picture2’ attribute has no file associated with it.
How can I avoid it?
class item (models.Model):
certificate=models.ImageField(default=None)
provider = models.ForeignKey(serviceProvider, on_delete=models.CASCADE, null=True)
radius = models.FloatField(default=None)
description= models.TextField(blank = True)
hour_init = models.TimeField()
hour_end = models.TimeField()
picture1=models.ImageField(default=None, blank=True)
picture2=models.ImageField(default=None,blank=True)
picture3=models.ImageField(default=None, blank=True)
This is the view function:
def addRubro (request):
if request.method == 'POST':
if request.POST.get("tipo")=="2":
proveedores=serviceProvider.objects.filter(user=request.POST.get("user"))
if not proveedores:
return HttpResponse("Bad")
else:
rubros=item.objects.filter(provider=proveedores.first())
if len(rubros)<2:
new = item()
new.provider=proveedores.first()
new.radius=request.POST.get("radius")
new.description=request.POST.get("description")
new.hour_init=request.POST.get("hour_init")
new.hour_end=request.POST.get("hour_end")
new.certificate=request.FILES.get("certificate")
new.picture1=request.FILES.get("picture1")
new.picture2=request.FILES.get("picture2")
new.picture3=request.FILES.get("picture3")
new.save()
return HttpResponse("Item loaded")
You can see that many times, a single image is sent, so the picture2 and picutre3 will be None .
Then when I try to send model information back to the client, I do it using this function
def requestRubros(request, tipo,user,rubro):
if tipo=="2":
proveedores=serviceProvider.objects.filter(user=user)
if proveedores:
rubro=item.objects.filter(provider=proveedores.first()).filter(items=rubro)
if rubro:
data = [{"radius": str(rubro.first().radius),
"description": rubro.first().description,},
{
"hour_init": str(rubro.first().hour_init), "hour_end": str(rubro.first().hour_end)},
{"certificate": "data:image/png;base64,"+base64.b64encode(rubro.first().certificate.read()).decode('ascii'),
"picture1": "data:image/png;base64,"+(base64.b64encode(rubro.first().picture1.read())).decode('ascii'),
"picture2": "data:image/png;base64,"+base64.b64encode(rubro.first().picture2.read()).decode('ascii'),
"picture3": "data:image/png;base64,"+base64.b64encode(rubro.first().picture3.read()).decode('ascii')}]
return JsonResponse(data, safe=False)
else:
return HttpResponse ("Bad data")
else:
return HttpResponse ("Bad data")