dcft
dcft

Reputation: 47

how to delete an image using django?

I want to know how to add a delete button in my form for deleting an image.

The project is a simple "Pics viewer", the index shows all the images that are stored but I want to add an "x" icon for deleting that specific image.

Here is my code.

views.py

from django.shortcuts import render, redirect
from gallery.forms import ImageForm
from gallery.models import Image

def index(request, image_form=None):
    image_form = image_form or ImageForm(request.POST, request.FILES)
    if request.method == 'POST':
        if image_form.is_valid():
            new_image = Image(image=request.FILES['image_file'])
            new_image.save()
    # obtenemos el listado de imagenes registradas
    images_list = Image.objects.all().order_by('-id')
    return render(request, 'index.html', {
        'image_form' : image_form,
        'images_list' : images_list,



    })

models.py

from django.db import models
from django.contrib import admin

class Image(models.Model):
    image = models.FileField(upload_to='static/gallery/%Y/%m/%d')

admin.site.register(Image)

forms.py

from django import forms

class ImageForm(forms.Form):
    image_file = forms.FileField(
        label='choose a file',
        help_text = 'Max 2 megabytes'
    )

index.html (It shows a list of images )

<style>
    ul {list-style:none; width:800px;}
    ul li {float:left; margin:6px;}
</style>
<form action="./gallery" method="post" enctype="multipart/form-data">
    {% csrf_token %}
    <p> {{ image_form.non_field_errors }} </p>
    <p> {{ image_form.image_file.label_tag }} </p>
    <p> {{ image_form.image_file.help_text }} </p>
    <p>
        {{ image_form.image_file.errors }}

        {{ image_form.image_file }}
    </p>
    <p> <input type="submit" value="subir"> </p>
</form>

<h2>Im&aacute;genes</h2>
<ul>
{% for image in images_list %}
    <li>
        <img src="/{{ image.image }}" height="75" />
    </li>
{% endfor %}

</ul>

I want to add on index.html the delete button deleting an image :D

Upvotes: 1

Views: 3099

Answers (2)

Ngenator
Ngenator

Reputation: 11259

views.py

from django.views.generic.edit import DeleteView
from django.core.urlresolvers import reverse_lazy
from myapp.models import Image

class ImageDelete(DeleteView):
    model = Image
    success_url = reverse_lazy('index')

urls.py

from myapp.views import index, ImageDelete

...
url(r'^image/(?P<id>\d+)/delete/$', ImageDelete.as_view(), name="image-delete"),
...

index.html

{% for image in images_list %}
    <li>
        <img src="/{{ image.image }}" height="75" />
        <a href="{% url 'myapp:image-delete' image.id %}">Delete</a>
    </li>
{% endfor %}

Upvotes: 0

catherine
catherine

Reputation: 22808

urls.py

[.........]
url(
   r'^delete-image/(?P<id>\d+)/$', 
   'delete_image', 
   name="delete_image"
),
[.........]

views.py

def delete_image(request, id):
    image = Image.objects.get(pk=id).delete()
    return HttpResponseRedirect(reverse('app_name:url_name'))

template

<ul>
    {% for image in images_list %}
    <li>
        <img src="/{{ image.image }}" height="75" /> 
        <a href="{% url app_name:delete_image image.id %}">Delete</a>
    </li>
    {% endfor %}
</ul>

Upvotes: 1

Related Questions