1

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

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...), поэтому я не могу получить его из данных [].

alt text 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/

ответ

3

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

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

+0

черт возьми, вы правы. Талли забывает о его проверке. Проверяют это через секунду. – crivateos

+0

к сожалению, когда я проверяю действительность формы, она не передается. Я не уверен, почему это происходит, поскольку поля, похоже, передают правильные данные. – crivateos

0

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

+0

Да, я уверен:

crivateos

Смежные вопросы