在注册时存储用户的头像

时间:2010-06-28 00:46:56

标签: django post django-forms django-signals user-registration

我有一个扩展的UserProfile用于注册新用户。我的user_created函数连接到注册基本User实例时发送的信号,并使用我的表单中的扩展字段创建新的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...)所以我无法从data []获取它。

alt text http://img38.imageshack.us/img38/3839/61289917.png 如果通常的变量在'data'里面,我应该在哪里查找文件?或者问题更复杂?奇怪的是我的表单没有属性cleaning_data ...我在这里使用dmitko的方法:http://dmitko.ru/?p=546&lang=en。我的:
表格:http://paste.pocoo.org/show/230754/
模型:http://paste.pocoo.org/show/230755/

2 个答案:

答案 0 :(得分:3)

您应该在使用之前验证表单,这将创建您习惯使用的“cleaning_data”属性。只需检查form.is_valid()并且“cleaning_data”属性将可用,并且应该包含文件。

表单的“data”属性将是您传入的第一个初始化参数(在本例中为request.POST),并且文件分别存储在“files”属性中(无论您传入的是什么)第二个参数,在这种情况下,request.FILES)。您不希望直接访问表单的“数据”或“文件”属性,因为如果您这样做,您只是直接从请求中读取数据而不会从使用表单中获得任何好处。

答案 1 :(得分:0)

您确定<form enctype="...">属性设置为multipart/form-data吗?否则浏览器无法上传文件数据。