在Django中显示上传的文件

时间:2015-08-01 21:32:44

标签: django filefield

我有一个显示您上传文件的信息中心。但我似乎无法弄清楚如何遍历这些文件。

以下是我的模特:

@python_2_unicode_compatible
class Client(models.Model):
    user = models.OneToOneField(User)
    company = models.CharField(max_length=100)

    def __str__(self):
        return self.company

    class Meta:
        verbose_name_plural = _("Clients")
        verbose_name = _("Client")
        permissions = (
            ("can_upload", _("Can upload files.")),
            ("can_access_uploads", _("Can access upload dashboard.")),
            ("is_client", _("Is a client.")),
        )

@python_2_unicode_compatible
class ClientUploads(models.Model):

    client = models.OneToOneField(Client)
    #created_at = models.DateTimeField(auto_now_add=True)

    def generate_filename(self, filename):
        name = "uploads/%s/%s" % (self.client.company, filename)
        return name

    file_upload = models.FileField(upload_to=generate_filename)

    def __str__(self):
        return self.client.company

    class Meta:
        verbose_name_plural = _("Client Uploads")
        verbose_name = _("Client Upload")

以下是我的观点:

@login_required(login_url='/dashboard-login/')
def dashboard(request):
    current_user = request.user
    current_client = request.user.client

    files = ClientUploads.objects.filter(client=current_client).values('file_upload')

    if request.method == 'POST':
        form = UploadFileForm(request.POST, request.FILES)
        if form.is_valid():
            new_file = ClientUploads(client=current_client, file_upload = request.FILES['file_upload'])
            new_file.save()

        return HttpResponsePermanentRedirect('/dashboard/')
    else:
        form = UploadFileForm()

    data = {'form': form, 'client': current_client, 'files': files}
    return render_to_response('dashboard.html', data, context_instance=RequestContext(request))

这是模板:

{% load i18n %}

<table class="table">
    <div>
        <p>{{ files }}</p>
    </div>
<tr>
    <th>{% blocktrans %}Filename{% endblocktrans %}</th>
    <th>{% blocktrans %}Size{% endblocktrans %}</th>
    <th>{% blocktrans %}Uploaded At{% endblocktrans %}</th>
</tr>
{% for file in files %}
<tr>
    <th>{{ file.name }}</th>
    <th>{{ file.size }}</th>
    <th>{{ file.url }}</th>
</tr>
{% endfor %}

</table>

模板中的测试div显示[{&#39; file_upload&#39;:u&#39; uploads / Company / archive_addin_log_408hdCy.txt&#39;}]这就是我上传的内容。它正在工作,但我无法弄清楚如何遍历所有上传的文件。我看到的只是表格标题下面的一堆空白行。

我使用files = ClientUploads.objects.filter(client=current_client).values('file_upload')来获取文件,我尝试了其他一些方法,但似乎无法让它发挥作用。我试过files = ClientUploads.objects.filter(client=current_client),但后来我得到一个QuerySet对象,不知道如何提取文件名并迭代。我真的不明白。

任何帮助都会非常感激,因为我很困惑。我似乎无法将文件对象从模型中取出。如何返回对象列表,然后在模板中显示文件字段中的文件对象,并显示created_at字段。我需要帮助了解如何访问模型中的不同字段。如果我在该模型中有一个文件对象列表,我可以迭代它和created_at字段,但我不知道如何做到这一点。

任何建议和例子都会有所帮助。

由于

编辑:

我还希望用户能够下载这些文件,如果他们点击了它在浏览器中显示文件的名称,因为我正在为媒体提供服务。我很可能会禁用它。但我确实需要让用户下载显示的文件。我怎么能做到这一点?我无法找到有关如何让用户下载文件的任何信息。

由于

1 个答案:

答案 0 :(得分:2)

values()返回一个名为ValuesQuerySet的特殊类,它的行为类似于包含您作为键/值对传递的属性的字典列表。

鉴于以上信息,以下查询将为您提供字典列表,其中每个字典包含每个ClientUploads对象的FileField实例:

files = ClientUploads.objects.filter(client=current_client).values('file_upload')

迭代模板中的dicts列表可能并不容易,因此我将按如下方式更改上述查询:

files = ClientUploads.objects.filter(client=current_client)

并在模板中更新 for 循环,如下所示:

{% for file in files %}
 {% with uploaded_file=file.file_upload %}    
  <tr>
    <th>{{ uploaded_file.name }}</th>
    <th>{{ uploaded_file.size }}</th>
    <th>{{ uploaded_file.url }}</th>
  </tr>
 {% endwith %}
{% endfor %}

希望这有帮助。