2

I have this model:

def generate_filename(self, filename):
    url = "files/users/%s/%s" % (self.user.id, filename)
    return url

class Upload(models.Model):
    user = modelo.ForeignKey(User, null=True)
    docfile = modelo.FileField(upload_to=generate_filename)

Views.py

allfiles = Upload.objects.all()

I have a list of uploaded files in django:

<ul>
    {% for item in allfiles %}
        <li><a href="{{ item.docfile.url }}">{{ item.docfile.name }}</a></li>
    {% endfor %}
</ul>

Its showing on html the full path of my file:

files/users/1/test.txt

I want to show only test.txt

I tryed this:

<ul>
    {% for item in arquivos %}
        <li><a href="{{ item.docfile.url }}">{{ item.docfile.name.split('/')[3] }}</a></a></li>
    {% endfor %}
</ul>

but I got Could not parse the remainder: '('/')' from 'item.docfile.name.split('/')[3]'

EDIT

I tryed to create a file in myapp/templatetags/filename.py:

import os

from django import template


register = template.Library()

@register.filter
def filename(value):
    return os.path.basename(value.docfile.name)

In template:

{% load filename %}
<ul>
    {% for item in allfiles %}
        <li><a href="{{ item.docfile.url }}">{{ item.docfile|filename }}</a></li>
    {% endfor %}
</ul>

And now I'm getting this:

'filename' is not a registered tag library. Must be one of:
admin_list
admin_modify
admin_static
admin_urls
cache
filaname
future
i18n
l10n
log
static
staticfiles
tz
Marllon Nasser
  • 390
  • 4
  • 22

1 Answers1

0

for me i will prefer you make a function inside your model that will do this for you

import os

class Upload(models.Model):
    user = modelo.ForeignKey(User, null=True)
    docfile = modelo.FileField(upload_to=generate_filename)

    def get_docfile_name(self):
        if not self.docfile:
            return ""
        file_path = self.docfile.name
        return os.path.basename(file_path)

in your template

<ul>
{% for item in allfiles %}
    <li><a href="{{ item.docfile.url }}">{{ item.get_docfile_name }}</a></li>
{% endfor %}

Transformer
  • 3,642
  • 1
  • 22
  • 33