【问题标题】:How to display Uploaded file to the user who upload it in Django?如何向在 Django 中上传文件的用户显示上传的文件?
【发布时间】:2019-09-20 04:19:58
【问题描述】:

我正在尝试构建一个系统,让用户可以在 Django 后端上传他们的 CSV 文件。但是我遇到了一个问题,我只想向上传它的用户显示 CSV 文件。我在模型中创建了一个字段,可以跟踪上传文件的用户。这是我的一些代码。

CSV 文件模型:

class Data(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE,default=1)
    filename = models.CharField(max_length=40,blank=False)
    csv_file = models.FileField(upload_to='documents/',blank=False)

    def __str__(self):
        return self.filename

以及视图逻辑:

def accounts(request):
    user = Data.objects.values('user')
    if user == request.user:
        main_data = Data.objects.all()
    else:
        main_data = "" 
    dict = {'main_data':main_data, 'name' : request.user.username}
    return render(request, 'accounts.html',dict)

我只得到那个 else 值'main_data=""'。

【问题讨论】:

  • 一个OneToOneField?那么,每个用户只允许一个文件?
  • 是的,现在我专注于每个用户一个文件。
  • user = Data.objects.values('user') 是一个返回 dict 值的查询集。您正在检查这是否是 request.user。你的表达式永远不会评估为True
  • @MarcellErasmus 那么,正确的做法是什么?
  • 我认为处理这种特殊情况的限制比允许许多限制更复杂。但回到主题:设置一个related_name 并使用request.user 中的那个。

标签: python django


【解决方案1】:

我们可以这样做:

try:
    data = request.user.data
except Data.DoesNotExist:
    data = ''

另外,查看Django's Official Documentation 中的一对一关系示例。

【讨论】:

    【解决方案2】:

    您正在尝试将request.user 与查询集进行比较,然后还返回所有Data 对象。您需要使用request.user,然后只返回链接到该用户的对象。

    def accounts(request):
        main_data = Data.objects.filter(user=request.user)
        dict = {'main_data': main_data}
        return render(request, 'accounts.html', dict)
    

    您也不需要dict 中的'name' : request.user.username。您可以通过main_data访问username

    【讨论】:

    • 您的代码几乎可以运行,但在前端通过{{main_data.0.filename}} 后返回<QuerySet []>
    • 您确定request.user 已上传文件吗?如果没有Data 对象链接到该用户,则查询集将为空。
    猜你喜欢
    • 1970-01-01
    • 2022-11-28
    • 2016-07-12
    • 2019-07-14
    • 2017-12-08
    • 1970-01-01
    • 1970-01-01
    • 2011-02-28
    • 1970-01-01
    相关资源
    最近更新 更多