我是新来的Pinax和Django。我试图通过有一个OneToOneField从我插入的另一个应用程序(在这种情况下,django-swingtime: http://code.google.com/p/django-swingtime/)拉扩展Pinax Profile模型。我已经得到了我所有的模型显示在django管理界面,但我不能添加新的用户(我想在添加新的配置文件的过程中做)。我得到以下错误:
IntegrityError at /admin/auth/user/add/
profiles_profile.event_type_id may not be NULL
Request Method: POST
Request URL: http://localhost:8000/admin/auth/user/add/
Django Version: 1.3.1
Exception Type: IntegrityError
Exception Value:
profiles_profile.event_type_id may not be NULL
我的Pinax版本是0.9a2。EventType是一个来自django-swingtime的模型。当我试图从Django admin中的任何地方添加一个用户时,我得到了这个错误。
这是我的Profiles/models.py(修改后的行旁边有注释)
from django.db import models
from django.utils.translation import ugettext_lazy as _
from idios.models import ProfileBase
from swingtime.models import EventType #ADDED HERE
class Profile(ProfileBase):
name = models.CharField(_("name"), max_length=50, null=True, blank=True)
about = models.TextField(_("about"), null=True, blank=True)
location = models.CharField(_("location"), max_length=40, null=True, blank=True)
website = models.URLField(_("website"), null=True, blank=True, verify_exists=False)
event_type = models.OneToOneField(EventType) #ADDED HERE
def __unicode__(self):
return "Name: %s -- %s" % (self.name, self.about) #ADDED HERE
也许如果有人能解释账户、个人资料和用户之间的关系,以及哪些文件可以编辑,哪些文件不建议编辑(例如,我认为我不想在我的Pinax站点包中改变任何东西…),我可以取得一些进展。另外,我假设这个idios插件参与了这个过程,但是我找到的文档链接将加载(http://oss.eldarion.com/idios/docs/0.1/)。
谢谢!
我已经解决了我的错误,尽管我对其他答案和其他信息感兴趣,因为其中一些是猜测/对我来说仍然不清楚。我认为这个错误源于Pinax账户自动为每个新用户创建一个"空白"的白痴配置文件(猜测)。因为我已经说过每个概要文件都必须有一个与之关联的OneToOne外部字段,并且不允许这个OneToOne字段为空,所以出现了一个问题。
这个问题描述了idios配置文件应用、Pinax帐户和标准django User帐户之间的一些区别:
pinax.apps。account, idios profile和django.auth.User
我解决这个问题的方法是使用Django的信号功能来确保一旦Profile生成,foreign field的实例也会生成。如下所示:
https://docs.djangoproject.com/en/1.3/topics/signals/请务必阅读有关双重信号的部分,因为这已经给其他人带来了麻烦:
https://docs.djangoproject.com/en/1.3/topics/signals/preventing-duplicate-signals
最后的修改我的代码,摆脱了错误是这样的。请注意,除了添加信令之外,我还明确表示允许OnetoOneField为空。
from django.db import models
from django.utils.translation import ugettext_lazy as _
from idios.models import ProfileBase
from swingtime.models import EventType
#for signals
from django.db.models.signals import post_save
from django.dispatch import receiver
class Profile(ProfileBase):
name = models.CharField(_("name"), max_length=50, null=True, blank=True)
about = models.TextField(_("about"), null=True, blank=True)
event_type = models.OneToOneField(EventType, null=True)
def __unicode__(self):
return "Name: %s -- %s" % (self.name, self.about)
def create_User_EventType(sender, instance, created, **kwargs):
print "checking creation of profile"
if created:
print "User event type is being created"
event_label = "%s_hours" % (instance.name)
print "the event label is" + event_label
EventType.objects.create(abbr=instance.name,label=event_label)
post_save.connect(create_User_EventType,sender=Profile,dispatch_uid="event_post_save_for_profile")