我正在开发一个基于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:我这样做的方式并不是最好的方式,我现在要尝试使用信号来达到同样的效果
答案 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中,然后就完成了。
答案 1 :(得分:0)
我认为错误是pub_date="12/12/2012"
:这不是DateTimeField
的有效值。相反,您想要给它一个datetime
object:datetime.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()