【问题标题】:How to get current user in django model?如何在 django 模型中获取当前用户?
【发布时间】:2015-10-07 12:47:07
【问题描述】:

我正在尝试创建一个动态文件夹来为每个用户存储一些 csv 文件。 我有 DemoUser 和文档。这是一个1对N的关系。 我想将用户的所有文档存储在其文件夹中,以用户 ID 命名。

但是我不知道该怎么做。我无法获取所有者名称。

这是我的代码:

models.py:

def get_upload_path(instance, filename):
    now = timezone.now().strftime("%Y_%m_%d")
    if(instance.owner.id is not None):
        return 'graphs/documents/{0}/email/' + now +'_{1}'.format(instance.owner.id, filename)

class Document(models.Model):
    docfile = models.FileField(upload_to=get_upload_path, validators=[import_document_validator])
    owner = models.ForeignKey(DemoUser)
    date_published = models.DateTimeField(_('date published'), default=timezone.now)

views.py:

if request.method == 'POST':
    form = DocumentForm(request.POST, request.FILES)
    if form.is_valid():
        newdoc = Document(owner=DemoUser.objects.get(id=request.user.id))
        newdoc.save()
        newdoc.docfile = request.FILES['docfile']
        newdoc.save()

文件已上传,但地址为:

图表/文档/{0}/email/2015_10_07_MOCK_DATA_2_qyt9xGe.csv

它没有得到 instance.owner.id 值。我尝试在添加 docfile 之前保存文档以尝试为对象设置所有者并获取 owner.id 值但没有成功。你能帮帮我吗?

非常感谢!

【问题讨论】:

  • 请不要做DemoUser.objects.get(id=request.user.id)之类的事情。 request.user 已经是那个确切的 DemoUser 实例,或者它根本不是 DemoUser 在这种情况下,通过 ID 查询是没有意义的。

标签: python django django-models django-views


【解决方案1】:

应该是:

return 'graphs/documents/{0}/email/{1}_{2}'.format(instance.owner.id, now, filename)

【讨论】:

  • 你可以这样做:return 'graphs/documents/{0}/email/'.format(instance.owner.id) + now +'_{0}'.format(filename)
  • @JaquelinePassos - 它可以接受连接字符串,但您的格式仅应用于最后一个字符串,通过将您的连接字符串组合成一个,您可以应用更多格式参数
【解决方案2】:

我发现为每个用户创建动态目录来存储文件的一种简单方法是为模型创建一个新方法,该方法将字符串分配给代表用户名的实例。这仅适用于需要将当前用户作为字符串来帮助格式化文件路径的简单情况。

#models.py
def get_upload_path(instance, filename):
    now = timezone.now().strftime("%Y_%m_%d")
    return 'graphs/documents/{0}/email/{1}_{2}'.format(instance.owner, now, filename)

class Document(models.Model):
    docfile = models.FileField(upload_to=get_upload_path)
    date_published = models.DateTimeField(_('date published'), default=timezone.now)

    def keep_owner(self,owner):
        self.owner = owner

#views.py
if request.method == 'POST':
    form = DocumentForm(request.POST, request.FILES)
    if form.is_valid():
        newdoc = form.save(commit=False)
        newdoc.keep_owner(request.user)
        newdoc.save()

【讨论】:

    猜你喜欢
    • 2012-06-15
    • 1970-01-01
    • 2012-11-16
    • 1970-01-01
    • 2014-08-15
    • 1970-01-01
    • 2016-04-06
    • 2013-11-25
    相关资源
    最近更新 更多