Хранение аватара пользователя при регистрации - PullRequest
1 голос
/ 28 июня 2010

У меня расширенный UserProfile для регистрации новых пользователей.Моя функция user_created соединяется с сигналами, посылаемыми при регистрации базового экземпляра пользователя, и создает новый профиль пользователя с расширенными полями из моей формы.Вот код:

from registration.signals import user_registered
from accounts.forms import ExtendedRegistrationForm
import accounts
from accounts.models import UserProfile

def user_created(sender, user, request, **kwargs):
    form = ExtendedRegistrationForm(request.POST, request.FILES)
    data = UserProfile(user=user)
    data.is_active = False
    data.first_name = form.data['first_name']
    data.last_name = form.data['last_name']
    data.pid = form.data['pid']
    data.image = form.data['image']
    data.street = form.data['street']
    data.number = form.data['number']
    data.code = form.data['code']
    data.city = form.data['city']
    data.save()

user_registered.connect(user_created)

Проблема в том, что в этой форме у меня есть поле изображения для аватара.Как видно из кода, я получаю данные из списка данных формы.Но, очевидно, imageField не отправляет свои данные с запросом POST (поскольку я получаю MultiValueDictKeyError at /user/register/, Key 'image' not found in <QueryDict...), поэтому я не могу получить их из данных [].

альтернативный текст http://img38.imageshack.us/img38/3839/61289917.png Если обычные переменные находятся внутри «данных», где мне искать файлы?Или проблема сложнее?Странно то, что моя форма не имеет атрибута cleaned_data ... Я использовал метод dmitko здесь: http://dmitko.ru/?p=546&lang=en.Мои:
формы: http://paste.pocoo.org/show/230754/
модели: http://paste.pocoo.org/show/230755/

Ответы [ 2 ]

3 голосов
/ 28 июня 2010

Вы должны проверить форму перед ее использованием, которая создаст атрибут «cleaned_data», к которому вы привыкли. Просто проверьте form.is_valid (), и атрибут «cleaned_data» будет доступен, и должен содержать файл.

Атрибут «data» формы будет тем, что вы передали в качестве первого аргумента инициализации (в данном случае, request.POST), а файлы хранятся отдельно в атрибуте «files» (независимо от того, что вы передаете как Второй аргумент, в данном случае, request.FILES). Вы не хотите получать прямой доступ к атрибутам «data» или «files» формы, поскольку, если вы это делаете, вы просто читаете данные прямо из запроса и не получаете никакой выгоды от использования форм.

0 голосов
/ 29 июня 2010

Вы уверены, что атрибут <form enctype="..."> имеет значение multipart/form-data? В противном случае браузер не сможет загрузить данные файла.

...