0

ファイルをアップロードしたログインユーザーが自分のファイルをダウンロードできるビューを実装しようとしていますが、他のユーザーのファイルではなく自分のファイルのみをダウンロードできるため、ファイルの 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 を開こうとして失敗します。私は何かを失っていますか?これはその機能で実現可能ですか?

4

2 に答える 2

1

最初のポイント: 応答は URL ではありません。テンプレートに必要なのは、応答ではなく URL です。2 番目のポイント: 応答の生成は、モデルではなくビューの責任です。補足: Python のコーディング規約を尊重する必要があります (cf 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>
于 2013-04-18T15:40:04.570 に答える
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 %}

お役に立てば幸いです。

于 2013-04-18T10:52:04.147 に答える