自定义Django后端在激活(或注册)时向用户添加对象

时间:2012-03-23 14:33:18

标签: django django-registration validationerror

我正在开发一个基于django的食谱网站,并且在自定义后端上遇到了麻烦。

我收到验证错误 - 当我尝试在后端保存我的cookbook实例时,没有提供异常。

这是我的后端:

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()

这是我的Cookbook模型:

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')

我相信这是我需要提供的所有东西才能得到一点帮助。

提前谢谢你,

一个。库珀

更新:错误是由pub_date传递的是字符串而不是日期时间引起的 update2:我这样做的方式并不是最好的方式,我现在要尝试使用信号来达到同样的效果

3 个答案:

答案 0 :(得分: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/

答案 1 :(得分: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日午夜。)< / p>

答案 2 :(得分:0)

我认为你不能将字符串传递给pub_date。尝试:

import datetime
pub_date=datetime.datetime.now()