2012-03-23 50 views
0

我工作的基礎上Django的食譜網站,並已運行到上的自定義後端碰釘子對象添加到用戶。自定義Django的後端在激活(或註冊)

我收到供應,當我嘗試保存我的食譜例如在後臺驗證錯誤 - 沒有例外。

這裏是我的後端:

from registration.backends.default import DefaultBackend 
from cookbook.models import Cookbook 
from django.contrib.auth.models import User 
from registration.models import RegistrationProfile 

class RecipeekActivationBackend(DefaultBackend): 
    def register(self, request, **kwargs): 
     new_user = super(RecipeekActivationBackend, self).register(request, **kwargs) 
     new_user.save() 
     cookbook = Cookbook(name=new_user.first_name, pub_date="12/12/2012", user=new_user) 
     print"cookbook" 
     cookbook.save() 
     return new_user 

錯誤發生在cookbook.save()

這裏是我的食譜型號:

class Cookbook(models.Model): 
    def __unicode__(self): 
     return self.name 
    name = models.CharField(max_length=50) 
    pub_date = models.DateTimeField('date published') 
    user = models.ForeignKey(User, related_name='cookbooks') 
    recipes = models.ManyToManyField('Recipe', related_name = 'cookbooks') 

我相信這是所有我需要供應,以獲得一些幫助。

預先感謝您,

A.庫珀

更新:錯誤是由PUB_DATE造成傳遞一個字符串,而不是日期時間 UPDATE2的:我要對這個方法是不是最好的這樣,我現在要嘗試使用信號來實現相同的效果

回答

2

你正在談論這一切都是錯誤的。認證後端是一件事:認證。你應該定製後端的唯一原因是,如果你想從另一個系統中,以配合認證或需要做出像使用電子郵件作爲用戶名的一些其他變化。否則,使用默認設置

爲了達到這個確切目的,Django提供了信號,這就是您應該使用的。

from django.db.models.signals import post_save 
from django.dispatch import receiver 

@receiver(post_save, sender=User) 
def create_cookbook_for_user(sender, instance, created, *args, **kwargs): 
    if created and not instance.cookbooks.exists(): 
     Cookbook.objects.create(name=instance.first_name, pub_date=date.today(), user=instance) 

假如把它放在你的models.py,就大功告成了。

參見:https://docs.djangoproject.com/en/dev/topics/signals/

+0

克里斯感謝您對本見地職位。我打算給它一個鏡頭。我對django非常陌生,想嘗試一下它所提供的一切 - 我還沒有了解信號,所以現在是時候這樣做了。再次感謝:) – snackerfish 2012-03-23 15:38:42

+0

克里斯這個效果很好,但由於某種原因名稱返回空白 是否有默認用戶first_name? – snackerfish 2012-03-23 15:49:56

+0

謝謝,但我解決了這個問題 - 我使用的是用戶名而不是first_name – snackerfish 2012-03-23 15:57:36

0

我認爲錯誤是pub_date="12/12/2012":這不是爲DateTimeField的有效值。相反,你想給它一個datetime objectdatetime.datetime(2012, 12, 12)(後import datetime)。

或許datetime.datetime.now(),或者根據實際用戶別的東西。

(另外,也許這應該是一個DateField,在這種情況下,你要datetime.date(2012, 12, 12)datetime.date.today()。以上datetime對象是指12月12日午夜。)

+0

這正是它,我愛你們太感謝你了 – snackerfish 2012-03-23 15:31:47

+0

正如克里斯·普拉特在他回答說,你要對這個錯誤的方式,你應該使用Django的信號。從長遠來看,它可以節省你的痛苦,它可以推廣到任何模型組合。請考慮! :-) – 2012-03-23 15:35:55

+0

我要去試試這個現在感謝你對好的方向 – snackerfish 2012-03-23 15:37:19

0

我不認爲你可以傳遞一個字符串PUB_DATE 。嘗試:

import datetime 
pub_date=datetime.datetime.now()