views:

468

answers:

3

Hello,

I am writing website and i`d like to implement profile managment. Basic thing would be to edit some of user details by themself, like first and last name etc. Now, i had to extend User model to add my own stuff, and email address.

I am having troubles with displaying form. Example will describe better what i would like achieve.

This is mine extended user model.

class UserExtended(models.Model): 
    user = models.ForeignKey(User, unique=True) 
    kod_pocztowy = models.CharField(max_length=6,blank=True) 
    email  = models.EmailField()

This is how my form looks like.

class UserCreationFormExtended(UserCreationForm): 
    def __init__(self, *args, **kwargs): 
        super(UserCreationFormExtended, self).__init__(*args, **kwargs)       
        self.fields['email'].required = True
        self.fields['first_name'].required = False
        self.fields['last_name'].required = False
    class Meta: 
        model = User 
        fields = ('username', 'first_name', 'last_name', 'email')

It works fine when registering, as i need allow users to put username and email but when it goes to editing profile it displays too many fields. I would not like them to be able to edit username and email. How could i disable fields in form?

Thanks for help.

A: 

You should create another form, that excludes the fields you don't want (or simply don't specify them in the fields list). Then pass the 2 different forms to the registration and edit-profile views.

Ofri Raviv
A: 

Try removing 'username' and 'email' from fields in Meta:

class Meta: 
    model = User 
    fields = ('first_name', 'last_name')
Almad
A: 

What i did is i created new form and used it and it worked. It allows to edit fields from User model not only UserExtended. Thanks for help.

class UserProfileForm(forms.ModelForm):

def __init__(self, *args, **kwargs):
    super(UserProfileForm, self).__init__(*args, **kwargs)
    try:            
        self.fields['first_name'].initial = self.instance.user.first_name
        self.fields['last_name'].initial = self.instance.user.last_name
        self.fields['email'].initial = self.instance.user.email
    except models.User.DoesNotExist:
        pass

email = forms.EmailField(label = "Główny adres email",
                         help_text="",
                         required=True)
first_name = forms.CharField(label = "Imię",
                             required=False)
last_name = forms.CharField(label = "Nazwisko",
                            required=False)
kod_pocztowy = forms.RegexField('\d{2}-\d{3}',
                                required = False,
                                label="Kod pocztowy",
                                error_messages={"invalid":'Poprawna wartość to np: 41-200'})

class Meta:
    model = UserExtended
    exclude  = ('user')

def save(self, *args, **kwargs):
    u = self.instance.user
    u.email = self.cleaned_data['email']
    u.first_name = self.cleaned_data['first_name']
    u.last_name = self.cleaned_data['last_name']
    u.kod_pocztowy = self.cleaned_data['kod_pocztowy']
    u.save()
    profile = super(UserProfileForm, self).save(*args, **kwargs)
    return profile
MichalKlich