2014-01-25 121 views
0

我有一個調查問卷,有一個響應模型,我想鏈接到一個現有的用戶。她應該能夠在個人資料頁面上查看她過去對調查的回覆。那麼,無論如何,這是計劃。但我甚至無法將用戶連接到響應。將user_id保存爲外鍵

(django的== 1.5,Django的lazysignup)

用戶目前在爲了得到鏈接

# models.p 
from django.contrib.auth.models import User 
class Response(models.Model): 
    survey = models.ForeignKey(Survey) 
    user = models.ForeignKey(User) 
    ... 

#views.py 
@allow_lazy_user 
def survey_detail(request, slug): 
    ... 
    if form.is_valid(): 
     response = form.save(commit=False) 
     response.user = request.user 
     response.save() 
     ... 

錯誤響應一個ForeignKey:

IntegrityError: null value in column "user_id" violates not-null constraint 

的場user_id包含在表格響應中。由於南模式遷移,我不得不設置一次性值並選擇一個現有的user_id。

有什麼想法?

+0

是否創建了懶惰的用戶?什麼是'response.form = save()'?我認爲它應該是'response.save()' – sneawo

+0

是的,你是對的:它是'response.save()'。我編輯它。是的,懶惰的用戶被創建。 –

回答

0

它的工作原理採用null=True, blank=True

class Response(models.Model): 
    survey = models.ForeignKey(Survey) 
    user = models.ForeignKey(User, null=True, blank=True) 
    ... 
1

你的代碼看起來不錯。我要做的第一件事是在保存之前檢查用戶對象。 print type(request.user), request.user。你也可以檢查你的Response模型對象,確保它是你期望的。這將表明您是否需要檢查表單代碼或裝飾器。

我不確定您爲南遷移「設置一次性值」的含義。南與此無關。你是否在談論一個用固定的user_id進行破解以獲取表單來保存?那是不對的。

正如您在自己的答案中所述,在用戶FK字段上設置null=True, blank=True將起作用,但實際上這意味着響應可以從「無人」提交。這樣做好像修復症狀。

您使用的是django-lazysignup(「django-lazyuser」看起來不是什麼東西)?這是一個潛在的陷阱。簡而言之,該軟件包創建的臨時用戶可以訪問convert/ URL來選擇用戶名和密碼以成爲正式用戶。因爲不是每個人都會這樣做,所以有一個管理命令來清除未轉換的懶惰用戶。該命令將刪除LazyUser模型對象真實的User模型對象。默認情況下,Django會級聯刪除相關對象,例如你的Response對象。爲防止響應在與未轉移的懶惰用戶關聯時被悄悄刪除,請在ForeignKey上設置級聯屬性(docs)。就像user = models.ForeignKey(User, on_delete=models.PROTECT)一樣,並確保ProtectedError安全處理。這隻在你使用清理管理命令時很重要,但比對不起更安全,維護代碼的下一個人可能會運行清理,因爲誰不喜歡清理。

+0

+1爲您的答案。是的,我正在使用django-lazysignup。我在我的問題中解決了它。你對清理程序是正確的。我沒有想到這一點。我需要創建自己的調查應用程序,作爲我的學士論文的基礎。我的教授表示,如果用戶能夠註冊以查看過去的投票選擇(該調查涉及信息安全),那將會很不錯。現在我必須做出以下選擇:(i)在您可以投票或(ii)每個人都可以投票之前有一個登錄要求。登錄要求用戶註冊她可能懶惰做的事。因此,lazysignup能夠在投票後保留答案。 –

+0

在沒有創建帳戶的開銷的情況下進行調查可能是有意義的。您可以評估您的受衆羣體,但創建帳戶是一個很大的障礙。只要清理不會刪除數據,也許只需要lazyuser信息和響應日期即可。聰明地使用LazySignUp!提交調查問卷後,您可以隨時提供「謝謝,添加用戶名和密碼以查看您的過去答案」頁面。很好的功能。 – JCotton

+0

謝謝J.我現在要保持lazysignup。我將檢查是否可以禁用清理例程並將其記錄在源代碼中。 –