Django расширяет пользовательскую модель и отображает форму - PullRequest
1 голос
/ 07 апреля 2010

Я пишу веб-сайт, и я хотел бы реализовать управление профилем. Основная вещь было бы отредактировать некоторые пользовательские данные самостоятельно, такие как имя и фамилия и т. д. Теперь мне пришлось расширить модель пользователя, чтобы добавить свои собственные вещи и адрес электронной почты.

У меня проблемы с отображением формы. Пример лучше опишу что я хотел бы добиться.

Это моя расширенная пользовательская модель.

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

Вот так выглядит моя форма.

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')

Он отлично работает при регистрации, так как мне нужно разрешить пользователям вводить имя пользователя и адрес электронной почты, но когда дело доходит до редактирования профиля, отображается слишком много полей. Я не хотел бы, чтобы они могли редактировать имя пользователя и электронную почту. Как я могу отключить поля в форме?

Спасибо за помощь.

Ответы [ 3 ]

0 голосов
/ 08 апреля 2010

Попробуйте удалить 'username' и 'email' из полей в Meta:

class Meta: 
    model = User 
    fields = ('first_name', 'last_name')
0 голосов
/ 18 апреля 2010

То, что я сделал, я создал новую форму и использовал ее, и она работала. Это позволяет редактировать поля из пользовательской модели не только UserExtended. Спасибо за помощь.

класс 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
0 голосов
/ 08 апреля 2010

Вам следует создать другую форму, исключающую ненужные поля (или просто не указывать их в списке полей). Затем передайте 2 различные формы для регистрации и просмотра профиля редактирования.

...