我有一个用于注册新用户的扩展用户封装。我的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并未带有发布请求的数据(当我得到 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/

有帮助吗?

解决方案

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

表单的“数据”属性将是您作为第一个intalization参数传递的任何内容(在这种情况下,请request.post),并且文件分别存储在“文件”属性中(无论您将其作为第二个参数传递,在这种情况下,请求.files)。您不想直接访问表单的“数据”或“文件”属性,因为,如果这样做,您只是直接从请求中读取数据,而不会从使用表单中获得任何好处。

其他提示

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top