2011-08-11 1 views
3

J'essaye de travailler sur l'ajout d'un champ de localisation au profil utilisateur et de l'associer à un utilisateur. J'ai actuellement quelque chose comme ceci:Extension d'un nouveau formulaire de création d'utilisateur, Django

Ceci est mon models.py:

from django.db import models 
from django.contrib.auth.models import User 
from django.db.models.signals import post_save 

class UserProfile(models.Model): 
     user = models.OneToOneField(User) 
     location = models.CharField(('location'),max_length=30, blank=False) 

def create_user_profile(sender, instance, created, **kwargs): 
    if created: 
     profile = UserProfile.objects.create(user=instance) 
     profile.save() 

post_save.connect(create_user_profile, sender=User) 

Ceci est mon admin.py:

from django.contrib import admin 
from django.contrib.auth.models import User 
from django.contrib.auth.admin import UserAdmin 
from django.contrib.auth.forms import UserCreationForm, UserChangeForm 
from django import forms 
from UserProfile.models import UserProfile 
from django.contrib.admin.views.main import * 

class MyUserCreationForm(UserCreationForm): 

    username = forms.RegexField(label=("Username"), max_length=30, regex=r'^[\[email protected]+-]+$', help_text = ("Required. 30 characters or fewer. Letters, digits and @/./+/-/_ only."),error_messages = {'invalid': ("This value may contain only letters, numbers and @/./+/-/_ characters.")}) 
    password1 = forms.CharField(label=("Password"), widget=forms.PasswordInput) 
    password2 = forms.CharField(label=("Password confirmation"), widget=forms.PasswordInput, help_text = ("Enter the same password as above, for verification.")) 
    email = forms.EmailField(label=("Email address")) 

    class Meta: 
     model = User 
     fields = ("username",) 

    def clean_username(self): 
     username = self.cleaned_data["username"] 
     try: 
      User.objects.get(username=username) 
     except User.DoesNotExist: 
      return username 
     raise forms.ValidationError(("A user with that username already exists.")) 

    def clean_email(self): 
    email = self.cleaned_data["email"] 
    if email == "": 
      raise forms.ValidationError(("")) 
    return email 

    def clean_password2(self): 
     password1 = self.cleaned_data.get("password1", "") 
     password2 = self.cleaned_data["password2"] 
     if password1 != password2: 
      raise forms.ValidationError(("The two password fields didn't match.")) 
     return password2 

    def save(self, commit=True): 
     user = super(UserCreationForm, self).save(commit=False) 
     user.set_password(self.cleaned_data["password1"]) 
     if commit: 
      user.save() 
     return user 

class MyUserChangeForm(UserChangeForm): 
    username = forms.RegexField(label=("Username"), max_length=30, regex=r'^[\[email protected]+-]+$', 
     help_text = ("Required. 30 characters or fewer. Letters, digits and @/./+/-/_ only."), 
     error_messages = {'invalid': ("This value may contain only letters, numbers and @/./+/-/_ characters.")}) 
    location = forms.CharField(label=("Location"),max_length=30) 

    class Meta: 
     model = User 

    def __init__(self, *args, **kwargs): 
     super(UserChangeForm, self).__init__(*args, **kwargs) 
     f = self.fields.get('user_permissions', None) 
     if f is not None: 
      f.queryset = f.queryset.select_related('content_type') 


class CustomUserAdmin(UserAdmin): 
    add_fieldsets = (
     (None, { 
      'classes': ('wide',), 
      'fields': ('username', 'email', 'password1', 'password2')} 
     ), 
    ) 
    fieldsets = (
     (None, {'fields': ('username', 'password')}), 
     (('Personal info'), {'fields': ('first_name', 'last_name', 'email', 'location')}), 
     (('Permissions'), {'fields': ('is_active', 'is_staff', 'is_superuser', 'user_permissions')}), 
     (('Important dates'), {'fields': ('last_login', 'date_joined')}), 
     (('Groups'), {'fields': ('groups',)}), 
    ) 
    add_form = MyUserCreationForm 
    form = MyUserChangeForm 

admin.site.unregister(User) 
admin.site.register(User, CustomUserAdmin) 

Je ne comprends pas bien le code Django/python et je Je sais que quelque chose manque à ce code, car lorsque j'ajoute un nouvel utilisateur, il n'enregistre pas le champ Emplacement dans la base de données. Il enregistre l'identifiant de l'utilisateur. Je suppose qu'il me manque quelque chose comme:

request.user.get_profile().location = self.cleaned_data["location"] 

mais je ne sais pas où le mettre.

+0

Votre code semble avoir une mauvaise indication. Il nous serait beaucoup plus facile de déboguer votre code, si vous corrigez l'indentation. Une chose que j'ai remarquée est que si vous voulez que l'email soit exigé, passez juste l'argument required = True, au lieu de le valider manuellement. – mohi666

Répondre

3

Vous pouvez utiliser le modèle d'héritage pour cela, qui font des choses semblables pour vous ...

Model Inheritance and proxy models...

+0

J'apprécierais l'aide réelle avec mon code. J'ai lu beaucoup de pages différentes et dans toutes les pages, les gens font des choses différentes. Lire plus ne m'aidera pas à mieux comprendre le code. – Angie

+0

De même, l'héritage du modèle n'est pas bon dans le cas de django.contrib.auth, les extensions du modèle User devraient se trouver dans le modèle UserProfile. – rewritten

2

Avez-vous essayé d'utiliser une ligne simple pour le profil? Oui, il sera montré en bas, mais sinon cela fonctionnerait.

from django.contrib import admin 
from django.contrib.auth.models import User 
from django.contrib.auth.admin import UserAdmin 
from website.users.models import UserProfile 

admin.site.unregister(User) 

class UserProfileInline(admin.StackedInline): 
    model = UserProfile 
    max_num = 1 

class UserProfileAdmin(UserAdmin): 
    inlines = [UserProfileInline] 
    add_fieldsets = (
     (None, { 
      'classes': ('wide',), 
      'fields': ('username', 'email', 'password1', 'password2')} 
     ), 
    ) 
    fieldsets = (
     (None, {'fields': ('username', 'password')}), 
     (('Personal info'), {'fields': ('first_name', 'last_name', 'email', 'location')}), 
     (('Permissions'), {'fields': ('is_active', 'is_staff', 'is_superuser', 'user_permissions')}), 
     (('Important dates'), {'fields': ('last_login', 'date_joined')}), 
     (('Groups'), {'fields': ('groups',)}), 
    ) 

admin.site.register(User, UserProfileAdmin) 
+0

J'ai essayé cela en fait mais je reçois cette erreur et je ne sais pas ce que cela signifie ou où il erreurs. 'column id_utilisateur n'est pas unique' – Angie

+0

Cela est dû au fait que vous n'avez pas déclaré le champ 'utilisateur' dans la classe UserProfile en tant que * -to-one. * Edit: oh mon dieu, vous avez déclaré être déclaré comme OneToOneField ... * – rewritten

+0

Essayez-vous d'insérer plus d'une adresse? Un utilisateur doit avoir au plus un profil, donc ajoutez l'option 'max_num' à l'en-ligne, comme édité. – rewritten

Questions connexes