在 Django 中显示上传的文件
Display uploaded files in Django
我有一个显示您上传的文件的仪表板。但我似乎无法弄清楚如何遍历文件。
这是我的模型:
@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显示[{'file_upload': u'uploads/Company/archive_addin_log_408hdCy.txt'}] 这是我上传的。所以它有效,但我不知道如何遍历所有上传的文件。我只看到 table 标题下的一堆空白行。
我使用 files = ClientUploads.objects.filter(client=current_client).values('file_upload')
获取文件,我尝试了其他几种方法,但似乎无法正常工作。我试过 files = ClientUploads.objects.filter(client=current_client)
但后来我只得到一个 QuerySet object 并且我不确定如何提取文件名并遍历。我真的不明白。
任何帮助将不胜感激,因为我很困惑。我似乎无法从模型中取出文件 object。我怎样才能 return object 的列表,然后在模板中显示文件字段中的文件 object 并显示 created_at 字段。我需要帮助了解如何访问模型中的不同字段。如果我在该模型中有一个文件列表 objects,我可以遍历它和 created_at 字段,但我不知道该怎么做。
任何建议和示例都会有很大帮助。
谢谢
编辑:
我还希望用户能够下载文件,现在如果他们单击名称,它会在我提供媒体服务时在浏览器中显示文件。我很可能会禁用它。但我确实需要让用户下载显示的文件。我怎样才能做到这一点?我找不到有关如何让用户下载文件的任何信息。
谢谢
values()
returns 一个名为 ValuesQuerySet
的特殊 class,它就像一个字典列表,包含您作为 key/value 对传递给它的属性。
鉴于上述信息,以下查询将为您提供字典列表,其中每个字典都包含每个 ClientUploads 对象的 FileField
实例:
files = ClientUploads.objects.filter(client=current_client).values('file_upload')
迭代模板中的字典列表可能并不容易,因此我将按如下方式更改上述查询:
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 %}
希望对您有所帮助。
我有一个显示您上传的文件的仪表板。但我似乎无法弄清楚如何遍历文件。
这是我的模型:
@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显示[{'file_upload': u'uploads/Company/archive_addin_log_408hdCy.txt'}] 这是我上传的。所以它有效,但我不知道如何遍历所有上传的文件。我只看到 table 标题下的一堆空白行。
我使用 files = ClientUploads.objects.filter(client=current_client).values('file_upload')
获取文件,我尝试了其他几种方法,但似乎无法正常工作。我试过 files = ClientUploads.objects.filter(client=current_client)
但后来我只得到一个 QuerySet object 并且我不确定如何提取文件名并遍历。我真的不明白。
任何帮助将不胜感激,因为我很困惑。我似乎无法从模型中取出文件 object。我怎样才能 return object 的列表,然后在模板中显示文件字段中的文件 object 并显示 created_at 字段。我需要帮助了解如何访问模型中的不同字段。如果我在该模型中有一个文件列表 objects,我可以遍历它和 created_at 字段,但我不知道该怎么做。
任何建议和示例都会有很大帮助。
谢谢
编辑:
我还希望用户能够下载文件,现在如果他们单击名称,它会在我提供媒体服务时在浏览器中显示文件。我很可能会禁用它。但我确实需要让用户下载显示的文件。我怎样才能做到这一点?我找不到有关如何让用户下载文件的任何信息。
谢谢
values()
returns 一个名为 ValuesQuerySet
的特殊 class,它就像一个字典列表,包含您作为 key/value 对传递给它的属性。
鉴于上述信息,以下查询将为您提供字典列表,其中每个字典都包含每个 ClientUploads 对象的 FileField
实例:
files = ClientUploads.objects.filter(client=current_client).values('file_upload')
迭代模板中的字典列表可能并不容易,因此我将按如下方式更改上述查询:
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 %}
希望对您有所帮助。