我正在尝试实现一个视图,其中已经上传文件的登录用户可以下载他的文件,但只有他的,而不是其他用户文件,所以我不创建基于pk的id的url档案。因此,在视图中,我查询test_result_file表,并为特定用户过滤它。我认为通过在我的模型中编写一个函数,我可以做我想做的事情:
class test_result_file(models.Model):
user=models.ForeignKey(User)
system=models.ForeignKey(system)
test_id=models.ForeignKey(Detail)
path=models.CharField(max_length=300)
class Meta:
verbose_name="Test Result file"
verbose_name_plural="Test Result files"
def get_self(self):
path=self.path
wrapper = FileWrapper(open( path, "r" ))
response=HttpResponse(wrapper, content_type="text/plain")
response['Content-Disposition'] ='attachment; filename="results.txt"'
return response
但是,在模板中,当我打电话时:
<ul>
{% for at in attempts %}
<li>System Name: <em>"{{ at.system}}"</em>, download file: <a href="{{at.get_self}}">here</a> </li>
{% endfor %}</ul>
未提供下载,而是浏览器尝试打开包含所有响应参数的URL并失败。 我失去了什么吗?这个功能可行吗?
答案 0 :(得分:1)
第一点:回复不是网址。您在模板中想要的是网址,而不是回复。第二点:产生响应是视图的责任,而不是模型的责任。旁注:您应该尊重Python的编码约定(参见pep08)
组织代码的RightWay(tm)将是:
# myapp/models.py
class TestResultFile(models.Model):
user=models.ForeignKey(User)
system=models.ForeignKey(System)
test_id=models.ForeignKey(Detail)
path=models.CharField(max_length=300)
class Meta:
verbose_name="Test result file"
verbose_name_plural="Test result files"
# myapp/views.py
def download_file(request, file_id):
testfile = get_object_or_404(TestResultFile, pk=file_id)
wrapper = FileWrapper(open(testfile.path, "r" ))
response=HttpResponse(wrapper, content_type="text/plain")
response['Content-Disposition'] ='attachment; filename="results.txt"'
return response
# myapp/urls.py
urlpatterns = patterns('',
url(r'^download/(?P<file_id>\d+)/?', 'views.download_file', 'myapp_download_file'),
# ...
)
# myapp/templates/myapp/template.html
<ul>
{% for at in attempts %}
<li>
System Name: <em>"{{ at.system}}"</em>,
download file: <a href="{% url 'download_file' at.pk %}">here</a>
</li>
{% endfor %}
</ul>
答案 1 :(得分:0)
也许你可以简单地使用这样的东西:
class userfile(model.Model):
user=models.ForeignKey(User)
file = models.FileField(_('file'), upload_to='userfile/', blank=False)
def __unicode__(self):
return "%s file" % user
并在你的模板中:
{% if user.userfile_set.count > 0 %}
<ul>
{% for file in user.userfile_set.all %}
<li>File: <a href="{{MEDIA_URL}}{{file.file}}">{{file}} dowload it</a></li>
{% endfor %}
</ul>
{% else %}
You don't have any file
{% endif %}
我跳,它可以帮助你。