2012-03-23 49 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()