2010-09-20 6 views
0

J'ai un profil d'utilisateur qui est actuellement montré dans l'Admin via une ligne empilée. Cependant, comme j'ai des champs tels que last_name_prefix et last_name_suffix (pour les noms étrangers tels que Piet van Dijk pour un tri correct par nom de famille), j'aimerais pouvoir entrelacer les champs du profil utilisateur avec les champs habituels de changement d'utilisateur. Ainsi, dans le changement interface utilisateur admin il apparaît comme ceci:Django entrelacement UserProfile avec profil dans Admin

Prénom:
Nom Prefix:
Nom
Nom Suffixe:

J'ai essayé cette solution: http://groups.google.com/group/django-users/browse_thread/thread/bf7f2a0576e4afd1/5e3c1e98c0c2a5b1. Mais cela créait juste des champs supplémentaires dans le formulaire utilisateur qui ne provenaient pas réellement du profil de l'utilisateur (ils sont restés vides même s'ils devraient obtenir des valeurs du profil de l'utilisateur).

Quelqu'un pourrait m'expliquer si cela pouvait être fait et comment? Merci beaucoup!

Répondre

0

Je suis sûr que vous auriez besoin de remplacer l'administrateur utilisateur normal.

Ce que je ferais en fait est de créer un forms.ModelForm spécial pour UserProfile appelé, disons UserProfileAdminForm qui comprenait également des champs du modèle User. Ensuite, vous enregistreriez UserProfile pour l'administrateur et la fonction save pour UserProfileAdminForm capturerait les champs spécifiques à l'utilisateur et créerait ou mettrait à jour l'enregistrement User (Ceci est laissé comme un exercice à l'OP).

Plus d'info

Quand je dis ajouter d'autres champs à une forme, je veux dire les ajouter manuellement:

class UserProfileAdminForm(forms.ModelForm): 
    username = forms.CharField(...) 
    email = forms.EmailField(...) 
    first_name = ... 
    last_name = ... 

    def __init__(self, *args, **kwargs): 
     super(UserProfileAdminForm, self).__init__(*args, **kwargs) 
     profile = kwargs.get('instance', None) 
     if profile and profile.user: 
      self.user = profile.user 
      self.fields['username'].initial = self.user.username 
      self.fields['last_name'].initial = ... 
      ... 

    class Meta: 
     model = UserProfile 
+0

Merci pour votre réponse. J'ai essayé plusieurs façons, mais je n'arrive pas à obtenir des champs de l'utilisateur et UserProfile dans un formulaire. Autant que je sache, c'est impossible. Voulez-vous dire que vous utilisez la classe Meta: model = UserProfile' et ajoutez manuellement les champs User (ces champs ne seront pas réellement connectés au modèle User). Pourriez-vous expliquer un peu plus en détail comment vous feriez cela? – Heyl1

+0

Oui, pour autant que je sache, il n'y a aucun moyen de le faire automatiquement. Mais une combinaison de mettre manuellement dans les champs, puis en utilisant 'initial' pour remplir les formulaires, et encore, en utilisant une fonction personnalisée' save' pour gérer l'enregistrement de l'enregistrement de l'utilisateur plus tard. Pour votre cas particulier, vous pouvez regarder ceci: http://scottbarnham.com/blog/2008/08/21/extending-the-django-user-model-with-inheritance/ –

+0

Jordan, merci encore pour votre réponse. Désolé pour la réponse tardive. J'ai regardé le lien et je l'ai testé. Ce qui ne fonctionnerait pas pour moi est de définir le mot de passe, car le lien vers la page de création du mot de passe est incorrect. Vous devez aller à l'instance utilisateur réelle et le faire là (donc l'utilisateur doit être dans l'admin). Je ne sais pas si vous avez une expérience avec cela. Je pense que la solution est assez soignée, mais je suis un peu hésitant à ne pas utiliser user_profile (et il y a quelques critiques dans les commentaires). Votre autre suggestion est moins intuitive mais je pense que je vais aller avec la solution du lien. – Heyl1