2013-04-18 13 views
0

我想實現一個視圖,其中已經上傳文件的登錄用戶可以下載他的文件,但只有他,而不是其他用戶文件,所以我不用根據文件的pk創建一個id url。因此,我在查詢test_result_file表時查看了特定用戶。我認爲我可以做我想做的在我的模型寫一個函數:Django - 提供從模型中定義的功能下載

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並失敗。 我失去了什麼?這個功能可行嗎?

回答

1

第一點:響應不是網址。你想在你的模板是urls,而不是迴應。第二點:產生響應是視圖的響應性,而不是模型的響應性。旁註:你應該尊重Python的編碼約定(CF pep08)

的華匯(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> 
+0

非常感謝。這就是我實施的或多或少..我只集成了@login_required和一些片段來檢查請求下載的人是誰上傳的。 – geompalik

+0

wrt /最後一點(「檢查請求下載的人是上傳者」),當檢索模型實例時需要額外的參數:'testfile = get_object_or_404(pk = file_id,user = request。用戶)'。 –

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 %} 

我一跳,它可以幫助你。

+0

謝謝你的回覆。它沒有按我想要的方式工作,但它幫助我走向正確的方向。 – geompalik