在Pinax中自定义配置文件模型:添加OnetoOneField时管理中的完整性错误

时间:2012-12-24 16:23:25

标签: django-models django-admin pinax

我是Pinax和Django的新手。我正在尝试扩展Pinax Profile模型,方法是从我插入的另一个应用程序(在这种情况下,django-swingtime:http://code.google.com/p/django-swingtime/)中提取一个OneToOneField。我已将所有模型显示在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管理员的任何地方添加用户时,我收到此错误。

这是我的个人资料/ 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/)。

谢谢!

1 个答案:

答案 0 :(得分:0)

我已经解决了我的错误,虽然我对其他答案和其他信息感兴趣,因为其中一些是猜测/我仍然不清楚。我认为该错误源于Pinax帐户自动为每个创建的新用户(推测)创建“空白”idios配置文件。由于我曾说过每个配置文件必须有一个与之关联的OneToOne外部字段,并且不允许此OneToOne字段为空,因此存在问题。

此问题描述了idios个人资料应用,Pinax帐户和标准django用户帐户之间的一些差异:

Difference between pinax.apps.accounts, idios profiles, and django.auth.User

我为解决这个问题所做的是使用Django的信令功能来确保一旦生成配置文件,外部字段的实例也是如此。这在这里描述:

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