首页 > 解决方案 > 无法使用 Django 通过 URL 访问文件字段文件

问题描述

tldr:访问文件字段的 URL 属性的问题让我意识到我还必须检查如何使用 django 的 runserver 在调试模式下提供媒体文件。我不知道如何继续。

长版:

我是 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')

我还将 DEBUG 模式设置为 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>

标签: pythonpython-3.xdjangofile-uploaddownload

解决方案


解决(至少部分)。

对于可能有类似问题的每个人:我将 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>

我很高兴它现在可以工作了。

现在我必须考虑如果我觉得不是覆盖文件而是将新文件写入磁盘并在名称中带有某种附录是否很好。而且我必须弄清楚如何在上传过程中重命名文件时保留文件扩展名。祝大家拥有美好的一天!


推荐阅读