【问题标题】:Getting username in ImageField upload_to path在 ImageField upload_to 路径中获取用户名
【发布时间】:2011-06-14 21:05:34
【问题描述】:

当用户上传图像时,我想在我的 upload_to 目录路径中包含用户名。这是我目前拥有的--

#model
class Avatar(models.Model):
    avatar = models.ImageField(upload_to='images/%s' %(USERNAME) )
     user = models.ForeignKey(UserProfile)

#form
class ProfilePictureForm(ModelForm):
    class Meta:
        model = Avatar
        fields = ('avatar',)

如何让模型中的USERNAME 能够设置upload_to 路径?

【问题讨论】:

    标签: django django-forms django-models


    【解决方案1】:

    upload_to 可以是可调用的而不是字符串,在这种情况下,它将传递当前实例和文件名——参见documentation。这样的东西应该可以工作(instance.user.user 因为instance.userUserProfile,所以instance.user.userUser)。

    def upload_to(instance, filename):
        return 'images/%s/%s' % (instance.user.user.username, filename)
    class Avatar(models.Model):
        avatar = models.ImageField(upload_to=upload_to)
        user = models.ForeignKey(UserProfile)
    

    【讨论】:

    • 这是问题的正确答案。但是,我会建议用户使用用户 ID 而不是用户名。您永远不知道何时需要修改用户名,这可能会带来一些麻烦。
    • @JeromeParadis 使用 id 存在问题,正如文档所说:“在大多数情况下,此对象尚未保存到数据库中,因此如果它使用默认的 AutoField,它可能还没有其主键字段的值。” docs.djangoproject.com/en/dev/ref/models/fields/…
    • @Caumons 好点。在这种情况下,我假设 UserProfile 实例已经被保存,并且 Avatar 是在另一个步骤中创建的。无论如何,我认为我的初始点有点没有意义,因为无论图像保存在哪里,路径都存储在 ImageField 对象中。唯一的问题是,如果允许更改用户名,您将失去图像路径和用户名之间的某种完整性。
    • 我建议使用 os.path.join 创建路径
    • @IsmailBadawi - 就我而言,没有UserProfile 表单。我有一些模型为class Document(models.Model): category = models.ManyToManyField(DocumentCategory, verbose_name=_("Document Category"), blank=True) file = models.FileField(_("Softcopy"), upload_to=upload_to, max_length=10000, null=True)
    【解决方案2】:

    Ismail Badawi 的回答是完全正确的。您还可以使用新的字符串格式和 lambda 函数。

    新的字符串格式:

    def upload_to(instance, filename):
        return 'images/{username}/{filename}'.format(
            username=instance.user.user.username, filename=filename)
    
    
    class Avatar(models.Model):
        avatar = models.ImageField(upload_to=upload_to)
        user = models.ForeignKey(UserProfile)
    

    新的字符串格式和 lambda 函数:

     path = lambda instance, filename: 'images/{username}/{filename}'.format(
            username=instance.user.user.username, filename=filename)
    
    
    class Avatar(models.Model):
        avatar = models.ImageField(upload_to=path)
        user = models.ForeignKey(UserProfile)
    

    【讨论】:

      猜你喜欢
      • 2012-03-01
      • 2018-02-25
      • 2013-09-15
      • 1970-01-01
      • 2011-01-15
      • 2011-02-08
      • 2016-05-24
      • 2012-06-12
      • 1970-01-01
      相关资源
      最近更新 更多