2010-06-28 104 views
1

我有一個擴展的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...),所以我不能從數據[]獲取它。

alt text http://img38.imageshack.us/img38/3839/61289917.png 如果通常的變量在'data'裏面,我應該在哪裏查找文件?或者問題更復雜?奇怪的是,我的表單沒有屬性cleared_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」屬性將可用,並且應包含該文件。

表單的「data」屬性將作爲它的第一個initalization參數(在本例中爲request.POST)傳入,並且文件將分別存儲在「files」屬性中(無論您傳入的是第二個參數,在這種情況下,request.FILES)。你不想直接訪問表單的「數據」或「文件」屬性,因爲如果你這樣做,你只是直接從請求中讀取數據,而沒有從表單中獲得任何好處。

+0

該死的你是對的。 Tally忘記驗證它。將在一秒鐘內檢查。 – crivateos 2010-06-28 09:18:02

+0

不幸的是,當我檢查表單的有效性時,它沒有通過。我不確定爲什麼會發生這種情況,因爲字段似乎通過了正確的數據。 – crivateos 2010-06-28 10:28:52

0

您確定<form enctype="...">屬性設置爲multipart/form-data?否則,瀏覽器無法上傳文件數據。

+0

是的,我確定:

crivateos 2010-07-01 20:08:06