Django: невозможно получить доступ к файлу файлового поля через URL

tldr: Проблемы с доступом к атрибуту url файлового поля привели меня к пониманию того, что я также должен проверить, как обслуживать медиа-файлы в режиме отладки с помощью сервера запуска django. Я понятия не имею, как продолжить. :(

длинная версия:

всем привет

Я новичок в Django и совершенно потерял, как получить доступ к объекту файлового поля с помощью браузера.

Вот мой settings.py в корне проекта:

import os 
# Build paths inside the project like this: os.path.join(BASE_DIR, ...) 
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 
MEDIA_ROOT = os.path.join(BASE_DIR, 'rgeingabe/documents/') 
MEDIA_URL = '' 
#STATIC_URL = 'static/' 
#STATIC_ROOT = os.path.join(BASE_DIR, 'rgeingabe/static')

Я также установил для режима отладки значение true.

Вот проект urls.py:

from django.conf.urls import include, url
from django.contrib import admin
from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^rgeingabe/', include('rgeingabe.urls')),
]

if settings.DEBUG:
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

Я надеюсь, что правильно включить эту статическую информацию в urls.py проекта. Сначала я попытался сделать это в приложении urls.py, но, думаю, это было неправильно.

Далее к models.py:

class Document(models.Model):
    beschreibung = models.CharField(max_length=255, blank=True)
    datei = models.FileField(upload_to='')
    hochgeladen_am = models.DateTimeField(auto_now_add=True)
    gehoert_zu_rg = models.ForeignKey('Pkvjanosch', on_delete=models.CASCADE)

def save(self, rgauswahl, *args, **kwargs):
    d = Pkvjanosch.objects.get(rg_id = rgauswahl)
    neuer_dateiname = d.rgsteller + " " + d.rgdatum.strftime("%d.%m.%Y")
    self.datei.name = neuer_dateiname
    super(Document, self).save(*args, **kwargs)
    d.scanablageort = neuer_dateiname
    d.save()

Я пытаюсь получить доступ к загрузке с видом. Здесь идет приложение views.py:

def uebersichteingaben_alle(request):
eingaben_alle_liste = get_list_or_404(Pkvjanosch)
alle_uploaddateien = get_list_or_404(Document)
context = {
        'eingaben_alle_liste': eingaben_alle_liste,
        'alle_uploaddateien': alle_uploaddateien
}
return render(request, 'rgeingabe/eingaben_alle.html', context)

И наконец я попробовал дюжину подходов, как получить доступ к объекту с помощью шаблона. Итак, я начал с чего-то вроде upload.url, но это не сработало. Также не подходили такие подходы, как "{% url upload %}" , " {% url upload.datei %}" , "{{upload.datei.url}} и многие другие. Как будто upload.url просто пуст. Вот шаблон:

<html>
<body>
    <h1>Übersicht aller Eingaben</h1>
    {% if eingaben_alle_liste %}
       <table style="border-style:solid;border-width:3px;" rules="all">
          <tr>
             <th>ID</th>
             <th>Rechnungssteller</th>
             <th>Rechnungsdatum</th>
             <th>Rechnungsbetrag</th>
             <th>TK Übernahme</th>
             <th>Continentale Übernahme</th>
             <th>Abrechnungszeitraum</th>
             <th>Anmerkungen</th>
             <th>Scan</th>
        </tr>
        {% for eintrag in eingaben_alle_liste %}
        <tr>
             <td><a href="{%url 'rg_janosch:rgupdate' eintrag.rg_id %}">{{ eintrag.rg_id }}</a></td>
             <td>{{ eintrag.rgsteller }}</td>
             <td>{{ eintrag.rgdatum }}</td>
             <td style="text-align:right;">{{ eintrag.rgbetrag }}</td>
             <td style="text-align:right;">{{ eintrag.tkbetrag}}</td>
             <td style="text-align:right;">{{ eintrag.contibetrag }}</td>
             <td style="text-align:center;">{{ eintrag.rg_zeitraum }}</td>
             <td>{{ eintrag.anmerkung }}</td>
        {% if eintrag.scanablageort %}
            {% for upload in alle_uploaddateien %}
                {% if upload.gehoert_zu_rg_id == eintrag.rg_id %}
             <td><a href="documents/{{ upload.datei }}">Scan</a></td>
             <td>upload.datei: {{upload.datei}}</td>
                {% endif %}
            {% endfor %}
        {% else %}
             <td>&nbsp;</td>
        {% endif %}
    </tr>
    {% endfor %}
</table>
{% else %}
<p>Keine Einträge vorhanden.</p>
{% endif %}
</body>
</html>

Я надеюсь, что вы можете мне помочь. :)

Всего 1 ответ


Решено (хотя бы частично).

Всем, у кого может быть похожая проблема: я изменил строки в settings.py на

MEDIA_ROOT = os.path.join(BASE_DIR, 'rgeingabe/documents/')
MEDIA_URL = '/documents/'
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'rgeingabe/static')

Конец urls.py моего проекта теперь читается так:

] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

Наконец в шаблоне я мог бы использовать это:

<td><a href="{{ upload.datei.url }}">{{ upload.datei.url }}</a></td>

Я так счастлив, что теперь это работает.

Теперь мне нужно подумать, если мне покажется хорошим, что вместо перезаписи файлов новые файлы записываются на диск с каким-то приложением в названии. И я должен выяснить, как сохранить расширение файла при переименовании файлов в процессе загрузки. Всем хорошего дня!


Есть идеи?

10000