python - 无法使用 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> </td>
{% endif %}
</tr>
{% endfor %}
</table>
{% else %}
<p>Keine Einträge vorhanden.</p>
{% endif %}
</body>
</html>
解决方案
解决(至少部分)。
对于可能有类似问题的每个人:我将 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>
我很高兴它现在可以工作了。
现在我必须考虑如果我觉得不是覆盖文件而是将新文件写入磁盘并在名称中带有某种附录是否很好。而且我必须弄清楚如何在上传过程中重命名文件时保留文件扩展名。祝大家拥有美好的一天!
推荐阅读
- javascript - HTML DOM - 将字符串分散到多行
- javascript - jquery只保留小数点后两个数字
- rust - 生命周期问题:“类型有不同的生命周期,但来自‘自我’的数据流入......”
- reporting-services - RDLC - VS 报告新页面
- background - 在鼠标悬停时用js更改背景图像
- c - 我在哪里可以找到 xcb 库的实现?
- python - 计算二维 Numpy 数组中数字对频率的最有效方法
- ruby - Ruby 程序未从 httparty 获取请求返回结果
- javascript - 如何在没有道具的情况下从反应中获取当前路线
- c# - 如何将多个 PlayerPrefs 保存到云保存