【问题标题】:Django upload to dynamic(ish) filenameDjango上传到动态(ish)文件名
【发布时间】:2012-03-06 12:45:06
【问题描述】:

这是我的表格:

class AvatarUploadForm(forms.Form):
    avatar = forms.ImageField(label='Image', help_text='Maximum size: 100x100px')

    # Validation stuff down here.

和型号:

class UserProfile(models.Model):
    user = models.OneToOneField(User)
    post_count = models.IntegerField(default=0)
    avatar = models.ImageField(null=True, blank=True, upload_to='images/avatars')
    # ...

以及当前未完成且可能存在错误的视图:

@login_required
def user(request, username):
    user = get_object_or_404(User, username=username)
    profile = user.profile
    if request.user == user:
        if request.method == 'POST':
            form = AvatarUploadForm(request.POST, request.FILES)
            if form.is_valid():
                 profile.avatar = request.FILES['avatar']
                 profile.save()
                 return render_to_response('forum/user.html', {'profile_user': user, 'profile': profile},
                     context_instance=RequestContext(request))
            else:
                form = AvatarUploadForm()

            return render_to_response('forum/user.html', { 'profile_user': user, 'profile': profile, 'form': form },
                context_instance=RequestContext(request))

    return render_to_response('forum/user.html', { 'profile_user': user, 'profile': profile })

我想要的是保留原始文件扩展名,.png、.gif 或其他文件,但将文件名更改为用户的 user_id 或用户名。

由于在注册时,用户不会上传头像,并且在您查看页面时会创建个人资料,头像上传表单是一个,我们可以假设用户个人资料已经存在。

我认为解决方案在于使 upload_to 成为可调用对象,但我不完全确定。

谢谢。

【问题讨论】:

  • 你的想法是对的。将其设为callable,如果有问题,请在此处提问。但是你应该先自己尝试一下。

标签: python django


【解决方案1】:

你是对的。 upload_to 可以是可调用的。这是我的一个项目的摘录,您可以根据自己的规格进行调整。这比您要求的要多,但我认为它显示了您可以拥有什么样的灵活性。

import os
import random
import string
from datetime import datetime

....

def generate_random_string(digit_length=6, char_length=6):
    digits = "".join( [random.choice(string.digits) for i in xrange(6)] )
    chars = "".join( [random.choice(string.letters) for i in xrange(6)] )
    return digits + chars

def item_upload_to(instance, filename):
    file_root, file_ext = os.path.splitext(filename)
    date = datetime.now().strftime("%Y/%m/%d")
    random_name = generate_random_string() + file_ext
    return '/'.join(['user-media',date, random_name])

....


class GenericImage(models.Model):
    user = models.ForeignKey(User, default=NEWAVENUE_USER_ID)
    original_image = models.ImageField(upload_to=item_upload_to)

【讨论】:

  • 谢谢。那是一个很好的例子。我刚刚使用了 instance.user.id,一切都很棒。
猜你喜欢
  • 2010-10-07
  • 1970-01-01
  • 2016-06-08
  • 2020-12-08
  • 2016-11-22
  • 2011-06-17
  • 2018-02-14
  • 2017-03-23
  • 2010-12-31
相关资源
最近更新 更多