Search code examples
pythondjangodjango-modelsdjango-templatesinline-formset

How can I get an image URL from an image field in an InlineFormset?


I have the following models:

class Event(models.Model):
    name = models.CharField(max_length=128, null=True, blank=True)

class Picture(models.Model):
    event = models.ForeignKey(Event)
    image = models.ImageField(upload_to='media')

Picture has an FK to Event model, so when I want to use them in a form (create an Event and add pictures to it), I use an inline formset.

# Event form not important here

PictureFormSet = inlineformset_factory(
    Event, 
    Picture, 
    min_num=1, 
    validate_min=True, 
    extra=1, 
    fields=(
        'image',
        ), 
    can_delete=True,
)

They work perfectly when I create an event and upload files. The problem is when I want to edit an Event. I use this view:

def event_summary(request, event_id):

    event = Event.objects.get(id=event_id)
    form = EventForm(instance=event)
    picture_formset = PictureFormSet(instance=event)

    if request.method == 'POST':
        form = EventForm(request.POST, instance=event)

        if form.is_valid():
            event_saved = form.save(commit=False)
            picture_formset = PictureFormSet(request.POST, request.FILES, instance=event_saved)

            if picture_formset.is_valid():
                event_saved.save()
                picture_formset.save()
                return redirect(active_events)

    return render(request, 'event_summary.html', {'form' : form, 'picture_formset' : picture_formset, 'event' : event})

And I want to display only the images URL in the template. If I use:

{% for picture_field in picture_formset %}
    {{ picture_field.image }}
{% endfor %}

It shows the url, and the select input, but I need the URL to use it in a thumbnail and the input separately. I've read that {{ picture_field.image.url }} works, but it doesn't.

Any help would be appreciated. Thanks.


Solution

  • Using the code provided by Alex, and this StackOverflow question, I solved it like this:

    {% for picture_field in picture_formset %}
        {% if picture_field.instance.image %}
            <img width="25%" src="{{ picture_field.instance.image.url }}" />
        {% endif %}
    {% endfor %}