Пользовательский Django Backend для добавления объекта к пользователю при активации (или регистрации) - PullRequest
0 голосов
/ 23 марта 2012

Я работаю над сайтом рецептов, основанным на django, и столкнулся с ошибкой в ​​пользовательских бэкэндах.

Я получаю сообщение об ошибке проверки - исключение не предоставляется, когда я пытаюсь сохранить свой экземпляр кулинарной книги вbackend.

вот мой backend:

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

Я считаю, что это все, что мне нужно предоставить, чтобы получить небольшую помощь.

Заранее спасибо,

A.Обновление Cooper

: ошибка была вызвана тем, что pub_date передавала строку вместо обновления datetime2: то, как я это делаю, не лучший способ, и теперь я собираюсь попытаться использовать сигналы для достижениятот же результат

Ответы [ 3 ]

2 голосов
/ 23 марта 2012

Вы идете об этом все неправильно.Бэкэнды аутентификации - это одно: аутентификация.Единственная причина, по которой вам следует настраивать бэкэнд, - это если вы пытаетесь привязать аутентификацию из другой системы или хотите внести какие-то другие изменения, например, использовать электронную почту для имени пользователя.В противном случае используйте значения по умолчанию

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 голосов
/ 23 марта 2012

Не думаю, что вы можете передать строку в pub_date. Попробуйте:

import datetime
pub_date=datetime.datetime.now()
0 голосов
/ 23 марта 2012

Я думаю, что ошибка с pub_date="12/12/2012": это недопустимое значение для DateTimeField. Вместо этого вы хотите присвоить ему datetime объект : datetime.datetime(2012, 12, 12) (после import datetime).

Или, может быть datetime.datetime.now(), или что-то еще в зависимости от фактического пользователя.

(Также, возможно, это должен быть DateField, в этом случае вы хотите datetime.date(2012, 12, 12) или datetime.date.today(). Объект datetime выше означает полночь 12 декабря.)

...