如何将图像保存到django中的用户文件夹?

Jan*_*and 5 django django-models

我想将上传的图像保存到单独的文件夹中。例如,用户 4 照片应存储在 /media/images/4/ 中

这是我想出的函数、模型和视图:

模型:

def get_uplaod_file_name(user,filename):
    return 'photos/%s/%s_%s' %  str(user.id),  (str(time()).replace('.','_'), filename)



class UserPic(models.Model):
    user = models.ForeignKey(User, unique=False)
    picfile = ImageWithThumbsField(upload_to= get_uplaod_file_name, sizes=((200,200),(1200,1200)))
    caption = models.CharField(max_length=200 , blank=True, null=True)
    created_at = models.DateTimeField(auto_now_add=True)


    @models.permalink
    def get_absolute_url(self):
        return ('view_pirate', None, {'user': self.account.user})    

    def __unicode__(self):
        return unicode(self.picfile.name) 
Run Code Online (Sandbox Code Playgroud)

浏览次数:

@login_required
def upload(request):
    # Handle file upload
    thisuser =User.objects.get(username = request.user.username)
    # Load pics of this user

    if request.method == 'POST':
        picform = PicForm(request.POST, request.FILES)
        if picform.is_valid():
            newpic = UserPic(picfile = request.FILES['picfile'])
            newpic = picform.save(commit=False)
            newpic.user_id = request.user.id
            newpic.save()
            message = "file %s is uploaded" % newpic

    else:
        picform = PicForm() # A empty, unbound form

    args= {}
    args['picform'] = picform

    return render_to_response('userpics/upload.html',args,
        context_instance=RequestContext(request))        
Run Code Online (Sandbox Code Playgroud)

然而,经过多次调整后,get_uplaod_file_name还是不行。我收到如下错误:

TypeError at /pics/upload/
not enough arguments for format string
Run Code Online (Sandbox Code Playgroud)

感谢您帮助解决此问题。

cat*_*ran 5

您应该将一个元组传递给字符串格式化运算符:

def get_uplaod_file_name(userpic, filename):
    return u'photos/%s/%s_%s' % (str(userpic.user.id),
                                 str(time()).replace('.', '_'),
                                 filename)
Run Code Online (Sandbox Code Playgroud)

请注意第一个和最后一个圆括号。

另请注意 unicode 前缀u',如果用户上传名称中包含非 ascii 符号的文件,则该前缀是必需的。