image in django won't upload via form

Viewed 25

I already found many answers to that question but most of them refer to adding request.FILES wchich doesn't work for me. I can upload an image via admin page, but when it comes to form i am getting an error that image is not loaded (while it is)

Here is my model

class Player(models.Model):
    name = models.CharField(max_length=30)
    surname = models.CharField(max_length=30)
    position = models.ForeignKey(Position,on_delete=models.CASCADE)
    shirt_number = models.IntegerField()
    team = models.ForeignKey(Team,null=True,on_delete=models.SET_NULL)
    image = models.ImageField(upload_to='images/players/')

Here is my form

class PlayerForm(forms.ModelForm):
    class Meta:
        model = Player
        exclude = ('team',)

Here is views.py

def team_detail(request,slug):
    team = get_object_or_404(Team, slug=slug)
    players = Player.objects.filter(team_id=team.id)
    if request.method == "POST":
        form = PlayerForm(request.POST,request.FILES)
        if form.is_valid():
            form.save()
            return redirect('')
    else:
        form = PlayerForm()
    return render(request,'team_detail.html',{'team':team,'players':players,'form':form})

And here is template file

    <form method = "POST">
    {% csrf_token %}
    {{ form.as_p }}
    <input type="submit" value="SUBMIT">
    </form>

Before submitting

After pressing submit button

1 Answers

You need to specify the enctype="…" attribute [mdn] to encode the file properly:

<form method="POST" enctype="multipart/form-data">
    {% csrf_token %}
    {{ form.as_p }}
    <input type="submit" value="SUBMIT">

In the view you will also need to specify a value for the Team of the instance you create:

def team_detail(request,slug):
    team = get_object_or_404(Team, slug=slug)
    if request.method == 'POST':
        form = PlayerForm(request.POST, request.FILES)
        if form.is_valid():
            form.instance.team = team
            form.save()
            return redirect('name-of-some-view')
    else:
        form = PlayerForm()
    players = Player.objects.filter(team=team)
    return render(request,'team_detail.html', {'team':team,'players':players,'form':form})
Related