Return only the file name in the view

Asked

Viewed 38 times

1

How do I display only the file name, example RET_PREF_ANAPOLIS..., removing the path arquivos/? inserir a descrição da imagem aqui

py.models:

def user_directory_path(instance, filename):
    if instance.tipo_arquivo.id == 1:
        tipo = 'RET'
    elif instance.tipo_arquivo.id == 2:
        tipo = 'REM'

    filename = '%s_%s_%s' % (tipo, instance.empresa.nome_empresa, filename)

    return os.path.join('arquivos', filename)

class Documento(models.Model):
    arquivo = models.FileField(upload_to=user_directory_path)
    tipo_arquivo = models.ForeignKey('TipoArquivo', on_delete=models.CASCADE)
    empresa = models.ForeignKey('Empresa', on_delete=models.CASCADE)
    data_upload = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.arquivo

py views.

class UploadArquivo(CreateView):
    model = Documento
    fields = ['arquivo', 'tipo_arquivo', 'empresa']
    template_name = 'upload_arquivo.html'
    success_url = reverse_lazy('lista_empresa')

class ListaArquivo(ListView):
    model = Documento
    fields = ['arquivo', 'tipo_arquivo', 'empresa']
    template_name = 'lista_arquivo.html'

view upload_html file.

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

view list_file.html

<h1>Arquivos</h1>
<table border="1">
    <thead>
        <th>Arquivo</th>
        <th>Tipo</th>
        <th>Empresa</th>
        <th>Download</th>
    </thead>
    <tbody>
        {% for documento in object_list %}
        <tr>
        <td>{{ documento.arquivo }}</td>
        <td>{{ documento.tipo_arquivo }}</td>
        <td>{{ documento.empresa }}</td>
        <td><a href="{{ documento.arquivo.url }}" download="">Download</a></td>
        </tr>
        {% endfor %}
    </tbody>
</table>

1 answer

1

Use the function basename module os.path:

>>> from os import path
>>> a='/usr/local/share/pixmaps/sample_image.png'
>>>> path.basename(a)
'sample_image.png'

You can create a function within the template to return this value:

class Documento(models.Model):
# ...
@property
def apenas_o_nome_do_arquivo(self):
    return path.basename(self.arquivo)

And within the template call him as:

<td>{{ documento.apenas_o_nome_do_arquivo }}</td>

Browser other questions tagged

You are not signed in. Login or sign up in order to post.