2010-06-26 19 views
2

J'ai des modèles django pour mon profil d'utilisateur étendu. Le problème est que ce code ne crée pas de tables quand syncdb est utilisé (rien ne se passe, aucune erreur de validation). Pourquoi cela se passe-t-il? (Également ces modèles donnent erreur d'importation ailleurs):Les modèles ne créent pas de tables lors de la synchronisation

#!/usr/bin/env python 
# encoding: utf-8 
from django.db import models 
from django.contrib.auth.models import User 
from registration.signals import user_registered 
from forms import ExtendedRegistrationForm 
import hashlib 

class InheritedProfile(models.Model): 
    first_name = models.CharField("Name", max_length=50, blank=True, null=True) 
    last_name = models.CharField("Last name", max_length=50, blank=True, null=True) 
    pid = models.CharField("PESEL", max_length=11, blank=True, null=True) 
    street = models.CharField("Street", max_length=50, blank=True, null=True) 
    number = models.CharField("Flat/house number", max_length=10, blank=True, null=True) 
    code = models.CharField("Zip ", max_length=6, blank=True, null=True) 
    city = models.CharField("City", max_length=50, blank=True, null=True) 
    class Meta: 
     abstract=True 

class UserProfile(InheritedProfile): 
    def upload_path(self, field_attname): 
     filename = hashlib.md5(field_attname).hexdigest()[:4] + "_" + field_attname 
     return "uploads/users/%s" % (filename,) 

    user = models.ForeignKey(User, unique=True, related_name='profile') 
    image = models.ImageField(upload_to=upload_path, verbose_name="Image", blank=True, null=True) 

    class Meta: 
     ordering = ['-id'] 
     db_table = 'userprofile' 

    def __unicode__(self): 
     return u"%s " % self.user.username 

def user_created(sender, user, request, **kwargs): 
    form = ExtendedRegistrationForm(request.POST) 
    extended_user = UserProfile(user=user) 
    extended_user.is_active = False 
    extended_user.first_name = form.cleaned_data['first_name'] 
    extended_user.last_name = form.cleaned_data['last_name'] 
    extended_user.pid = form.cleaned_data['pid'] 
    extended_user.image = form.cleaned_data['image'] 
    extended_user.street = form.cleaned_data['street'] 
    extended_user.number = form.cleaned_data['number'] 
    extended_user.code = form.cleaned_data['code'] 
    extended_user.city = form.cleaned_data['city'] 
    extended_user.save() 

user_registered.connect(user_created) 

class Friend(InheritedProfile): 
    friend_of = models.ForeignKey(UserProfile, related_name='friend_of') 
    class Meta: 
     db_table = 'friend' 

Contrairement ce code produit des tables parfaitement:

#!/usr/bin/env python 
# encoding: utf-8 
from django.db import models 
from django.contrib.auth.models import User 
import hashlib 

class InheritedProfile(models.Model): 
    first_name = models.CharField("Name", max_length=50, blank=True, null=True) 
    last_name = models.CharField("Last name", max_length=50, blank=True, null=True) 
    pid = models.CharField("PESEL", max_length=11, blank=True, null=True) 
    street = models.CharField("Street", max_length=50, blank=True, null=True) 
    number = models.CharField("Flat/house number", max_length=10, blank=True, null=True) 
    code = models.CharField("Zip ", max_length=6, blank=True, null=True) 
    city = models.CharField("City", max_length=50, blank=True, null=True) 
    class Meta: 
     abstract=True 

class UserProfile(InheritedProfile): 
    def upload_path(self, field_attname): 
     filename = hashlib.md5(field_attname).hexdigest()[:4] + "_" + field_attname 
     return "uploads/users/%s" % (filename,) 

    user = models.ForeignKey(User, unique=True, related_name='profile') 
    image = models.ImageField(upload_to=upload_path, verbose_name="Image", blank=True, null=True) 

    class Meta: 
     ordering = ['-id'] 
     db_table = 'userprofile' 

    def __unicode__(self): 
     return u"%s " % self.user.username 

class Friend(InheritedProfile): 
    friend_of = models.ForeignKey(UserProfile, related_name='friend_of') 
    class Meta: 
     db_table = 'friend' 

Dois-je déplacer cette fonction user_created ailleurs? Les signaux ne devraient pas créer de problèmes ici ...

+0

Est-il possible que dans 'formes' vous importez probablement' models' ou un modèle spécifique? –

+0

J'importais des modèles spécifiques. Ok, je ne sais pas pourquoi cette fonction est entrée en collision avec la création de tables pour les modèles, mais je l'ai déplacé dans un fichier différent. Maintenant tout fonctionne. – crivateos

Répondre

3

Eh bien, vous semblez avoir une sorte d'importation croisée; si vous importez certains modèles à forms et que certains d'entre eux retournent à models cela ne peut pas être résolu, car lors du traitement modelsforms est nécessaire pour être importé, et forms nécessite models encore ... Cela ne peut pas être résolu! En plus de cela, je pense que c'est mieux de ne pas avoir à importer des formulaires dans un module de modèles, car ils sont plus liés aux vues!

+1

Les importations circulaires se résolvent parfaitement bien. Ce sont les recherches d'attributs dans les modules qui ne le peuvent pas. http://stackoverflow.com/questions/3082015/python-module-initialization-order/3082097#3082097 –