Шаблон Python Django не может получить имя из функции модели

Хотя я понял, что могу вызвать определение функции из наших моделей, я не могу извлечь имя файла моего загруженного документа. Ниже я попробовал следующий формат шаблона, но любой результат соответствует моему желаемому результату:

.html Версия 1

<form action="." method="GET">
{% if documents %}
   <ul>
      {% for document in documents %}
        <li> {{ document.docfile.filename }}
        <input type = "submit" name="load-data" value="Add to Layer"/>
        </li>
      {% endfor %}
  </ul>

Результат: отображается только кнопка.

.html Версия 2

<form action="." method="GET">
{% if documents %}
   <ul>
      {% for document in documents %}
        <li> {{ document.filename }}
        <input type = "submit" name="load-data" value="Add to Layer"/>
        </li>
      {% endfor %}
  </ul>

Результат: отображается только кнопка.

.html Версия 3

<form action="." method="GET">
{% if documents %}
   <ul>
      {% for document in documents %}
        <li> {{ document.docfile.name }}
        <input type = "submit" name="load-data" value="Add to Layer"/>
        </li>
      {% endfor %}
  </ul>

Результат: печатается полный путь (например, /documents/2016/10/08/filename.csv) вместе с кнопкой

Вот остальная часть моего кода:

models.py

class Document(models.Model):
     docfile = models.FileField(upload_to='document/%Y/%m/%d')

     def filename(self):
        return os.path.basename(self.file.name)

views.py

documents = Document.objects.all()
return render(request, 'gridlock/upload-data.html',
              {
               'documents' : documents,
               'form': form
              })

Надеюсь, кто-нибудь объяснит, почему все, что я пробовал: {{ document.docfile.filename }}, {{document.file.filename}} или {{document.filename}}, у меня тоже не работает? Спасибо!


person Reiion    schedule 18.10.2016    source источник
comment
Лучше создать template tag вместо редактирования моделей. Проверьте [SO Post] [1] из приведенного выше ответа. Вы найдете ответ при создании тега шаблона. [1]: stackoverflow.com /вопросы/2683621/   -  person cutteeth    schedule 18.10.2016


Ответы (1)


Я думаю, что вы довольно близко подошли к {{ document.filename }}, за исключением того, что в ваших моделях вам нужно изменить

def filename(self):
    return os.path.basename(self.file.name)

в

def filename(self):
    # try printing the filename here to see if it works
    print (os.path.basename(self.docfile.name))
    return os.path.basename(self.docfile.name)

в ваших моделях это поле называется docfile, поэтому вам нужно использовать self.docfile, чтобы получить его значение.

источник: файловое поле django возвращает имя файла только в шаблоне

person Jonas Grumann    schedule 18.10.2016
comment
Спасибо! Это правильный ответ! Я прочитаю ссылку, которую вы только что связали! - person Reiion; 18.10.2016
comment
ооо теперь понял. вот что меня смутило под моделями! еще раз спасибо! - person Reiion; 18.10.2016