【问题标题】:How to download files from user_directory_path in django如何从 django 中的 user_directory_path 下载文件
【发布时间】:2019-10-09 10:57:36
【问题描述】:

我正在尝试下载上传到我的 django 媒体目录的文件。 我能够成功上传文件,但我不知道下载这些文件的最佳方法。我在网上看到了不同的例子,但我并不完全理解它们。这是我的代码

models.py:

def user_directory_path(instance, filename):
    # file will be uploaded to MEDIA_ROOT/user_<id>/<filename>
    return 'user_{0}/{1}'.format(instance.user.id, filename)

class Profile(models.Model):
       user = models.OneToOneField(User, on_delete=models.CASCADE)
       certification = models.FileField(upload_to=user_directory_path, blank=True)

urls.py

    urlpatterns = [
    .........
    path('profile/', user_views.profile, name='profile'),

]

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

文件.html:

        <a href="{{ user.profile.certification.url }}">Download Certification</a>

我收到此错误:

ValueError
     The 'certification' attribute has no file associated with it.

我是否在我的views.py 中创建一个视图并在我的urls.py 中创建一个url 来处理下载?如果是这样,我该怎么做。

【问题讨论】:

    标签: django django-media


    【解决方案1】:

    错误信息很清楚:

    'certification' 属性没有与之关联的文件。

    这意味着此profile 实例的certification 字段为空(未上传任何文件)。如果没有文件路径,你就不能构建一个 url,是吗?

    您在这里有两个解决方案:要么将 certification 字段设为必填(删除 blank=True 参数) - 但如果您已经拥有没有认证的配置文件,这将无法解决问题 - 和/或测试 @987654325 @ 在尝试获取 url 之前:

    {% if user.profile.certification %}
       <a href="{{ user.profile.certification.url }}">Download Certification</a>  
    {% else %}
        <p>This user hasn't uploaded their certification</p>
    {% endif %}
    

    【讨论】:

    • 谢谢。我清除了我的数据库并重新上传了文件并且 {{ user.profile.certification.url }} 工作。我在没有认证的情况下创建了个人资料。再次感谢
    • @Bruce 很高兴它解决了您的问题(那时您可以考虑接受答案)。请注意,在模板中显示 url 之前,您仍应测试认证文件是否存在。
    • 是的,我做到了。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-28
    • 2019-02-27
    • 2020-01-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多