2012-12-24 1 views
0

Je suis nouveau sur Pinax et Django. J'essaye d'étendre le modèle de profil de Pinax en ayant un OneToOneField qui tire d'une autre application que j'ai branchée dedans (dans ce cas, django-swingtime: http://code.google.com/p/django-swingtime/). J'ai tous mes modèles à afficher dans l'interface d'administration django, mais je ne peux pas ajouter de nouveaux utilisateurs (ce que je veux faire dans le processus d'ajout de nouveaux profils). Je reçois l'erreur suivante:Personnalisation du modèle de profil dans Pinax: erreur d'intégrité dans l'admin lors de l'ajout de OnetoOneField

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 

Ma version de Pinax est 0.9a2. EventType est un modèle de django-swingtime. J'ai cette erreur quand j'essaye d'ajouter un utilisateur de n'importe où dans l'admin de Django.

Voici le mes profils/models.py (lignes modifiées ont des commentaires à côté d'eux)

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 

Peut-être que si quelqu'un pourrait expliquer la relation entre les comptes, les profils et les utilisateurs et quels fichiers sont OK pour modifier et celles qui ne sont pas recommandables à éditer (par exemple, je ne pense pas que je veux changer quelque chose dans mes paquets de site Pinax ...), je peux faire quelques progrès. Aussi, je suppose que ce plugin idios est impliqué dans le processus, mais le lien vers la documentation que j'ai trouvé se chargera (http://oss.eldarion.com/idios/docs/0.1/).

Merci!

Répondre

0

J'ai résolu mon erreur, même si je suis intéressé par d'autres réponses et des informations supplémentaires, car certaines d'entre elles sont des spéculations/ne sont toujours pas claires pour moi. Je pense que l'erreur provient des comptes Pinax créant automatiquement un profil idios "vide" pour chaque nouvel utilisateur créé (spéculation). Puisque j'avais dit que chaque profil devait avoir un champ étranger OneToOne associé et qu'il n'avait pas permis à ce champ OneToOne d'être nul, il y avait un problème.

Cette question décrit certaines des différences entre l'application du profil de idios, compte Pinax et les comptes standards django utilisateur:

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

Ce que je l'ai fait pour résoudre ce problème a été en utilisant les capacités de signalisation de Django pour faire Assurez-vous que dès qu'un profil est généré, il en est de même pour une instance du champ étranger. Ceci est décrit ici:

https://docs.djangoproject.com/en/1.3/topics/signals/

Assurez-vous de lire le bit environ le double de la signalisation, car cela a causé des problèmes pour d'autres personnes:

https://docs.djangoproject.com/en/1.3/topics/signals/#preventing-duplicate-signals

La dernière modification à mon code s'est débarrassé de l'erreur était-ce. Notez que, outre l'ajout de signalisation, j'ai également explicitement déclaré que le champ OnetoOneField pouvait être nul.

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