2010-11-22 6 views
3

J'essaye de créer une petite application pour que les utilisateurs aient des contacts. J'utilise django-profiles comme base pour mes profils. Maintenant, tout fonctionne bien jusqu'à ce que j'essaie de soumettre le formulaire de contact d'édition et je reçois cette erreur. Etant assez nouveau à Django, je ne suis même pas sûr si je prends la bonne approche ici. Mon but final est que l'utilisateur puisse ajouter autant de contacts que nécessaire. Tout conseil est apprécié.Django - Lier mes modèles aux profils (UserProfile) modèle

modèle Mon UserProfile qui étend l'utilisateur ressemble:

class UserProfile(models.Model): 
#User's Info 
user = models.ForeignKey(User, unique=True) 
first_name = models.CharField("first name", max_length=30) 
last_name = models.CharField("last name", max_length=30) 
home_address = models.CharField(max_length=50) 
primary_phone = PhoneNumberField() 
city = models.CharField(max_length=50) 
state = USStateField() 
zipcode = models.CharField(max_length=5) 
birth_date = models.DateField() 
gender = models.CharField(max_length=1, choices=GENDER_CHOICES, blank=True) 

et mon modèle de contact ressemble à ceci:

class Contact(models.Model):  
user = models.ForeignKey(UserProfile) 

contact_description = models.CharField("Relation or Description of Contact", max_length=50, blank=True) 
contact_first_name = models.CharField("contact first name", max_length=30) 
contact_last_name = models.CharField("contact last name", max_length=30) 
contact_primary_phone = PhoneNumberField("contact primary phone number") 
contact_secondary_phone = PhoneNumberField("contact secondary phone number",blank=True) 

et moi:

def editContact(request, username, object_id=False, template_name='contacts/edit.html'): 

user = UserProfile.user 

AddContactFormset = inlineformset_factory(UserProfile,Contact, extra=1) 
if object_id: 
    contact=Contact.objects.get(pk=object_id) 
else: 
    contact=Contact() 
if request.method == 'POST': 
    f= ContactForm(request.POST, request.FILES, instance=contact) 
    fs = AddContactFormset(request.POST, instance=contact) 
    if fs.is_valid() and f.is_valid(): 
     f.save() 
     fs.save() 
     return HttpResponse('success') 
else: 
    f = ContactForm(instance=contact) 
    fs = AddContactFormset(instance=contact) 

return render_to_response(template_name ,{'fs':fs,'f':f,'contact': contact}, context_instance=RequestContext(request)) 
+0

Pourquoi avez-vous un FK pour le profil et non pour l'utilisateur lui-même? –

Répondre

9

Fondamentalement django-profils est pour quelque chose d'autre - il aide simplement à créer et gérer des profils d'utilisateurs à travers une application.

Tout d'abord - vous devez lier Contact les modèles directement au django.contrib.auth.models.User via ForeignKey. De cette façon, vous pouvez accéder aux contacts de l'utilisateur donné par une simple requête. User.contact_set.all() - il vous retournera une liste des contacts de l'utilisateur. Cela permettra également de se débarrasser de votre erreur.

deuxième - fileds comme first_name, last_name sont déjà DÉFINIES dans django.contrib.auth.models.User, donc il n'y a pas besoin de les définir à nouveau dans UserProfile. Lire la source du modèle d'utilisateur ici: http://goo.gl/8oDv3

tiers - si l'utilisateur ne peut avoir qu'un seul profil et vous n'êtes pas l'intention d'utiliser des versions très anciennes de django alors vous devriez utiliser OneToOneField au lieu de ForeignKey.

Quatrième chose - vous pourriez probablement omettre l'utilisation de RequestContext() en utilisant l'une des vues génériques fournis avec django - lire à ce sujet ici: http://goo.gl/U4DWs

Dernière chose - rappelez-vous que le modèle principal pour la manipulation des utilisateurs est le modèle User lui-même. Tout profil personnalisé est simplement une extension, donc reliez tout ce qui est lié à l'utilisateur au modèle utilisateur lui-même.

Bonne codification!

+0

Relié au point 3: http://stackoverflow.com/questions/3221745/django-when-extending-user-better-to-use-onetoonefielduser-or-forekeykeyuser –

+0

+1 pour les deux premiers paragraphes. – Soask

1

précisiez bx2's answer, votre modèle de contact devrait ressembler à ceci:

class Contact(models.Model):  
    user = models.ForeignKey(User, related_name='contacts') 
    contact_description = models.CharField("Relation or Description of Contact", max_length=50, blank=True) 
    contact_first_name = models.CharField("contact first name", max_length=30) 
    contact_last_name = models.CharField("contact last name", max_length=30) 
    contact_primary_phone = PhoneNumberField("contact primary phone number") 
    contact_secondary_phone = PhoneNumberField("contact secondary phone number",blank=True) 

vous, franchement, ne fait pas beaucoup de sens. En général, un ensemble de formulaires en ligne est censé représenter des enregistrements liés à un enregistrement parent. Dans votre cas, ce serait l'enregistrement de l'utilisateur, les contacts étant les enregistrements "enfants". Mais avoir à la fois un formulaire de contact et un AddContactFormset n'a pas beaucoup de sens.

En outre, je recommande d'utiliser des noms de variables comme f et fs dans Django. En dehors des variables comme les index, les compteurs, etc., il ne sert à rien d'utiliser de courts noms de variables de 1-2 caractères.Allez-y et utilisez des noms de variables plus longs comme form et formset, ou même contact_form et contact_formset. Cela rend beaucoup plus facile de déboguer le code dans le futur.

Questions connexes