Django загрузить в динамическое (ish) имя файла - PullRequest
1 голос
/ 06 марта 2012

Итак, вот моя форма:

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 или username пользователя.

Поскольку при регистрации пользователи не загружают аватар, а при просмотре страницы создаются профили при загрузке аватара, мы можем предположить, что профиль пользователя уже существует.

Я думаю, что решение где-то в том, чтобы сделать upload_to вызываемым, но я не совсем уверен.

Спасибо.

1 Ответ

5 голосов
/ 06 марта 2012

Вы правы. 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...