Обновление метода сохранения формы django с 1.4 до 1.5

У меня был рабочий метод сохранения в моей форме, и как только я обновил его, он работает очень странно, и я не могу отладить источник проблемы

У меня есть простая форма, унаследованная от ModelForm, в которой я переопределил метод save, чтобы сохранить некоторые внешние атрибуты

ниже мой код

class UserProfileForm(ExtendedMetaModelForm):
    """
    UserProfileForm

    """
    _genders = (
        ('M', _('Male')),
        ('F', _('Female')),
        )

    birthday            = forms.DateField(
        widget=extras.SelectDateWidget(attrs={'class' : 'span1'},years=(range(1930, datetime.now().year-14))),
        label   =   _('Birthday'),
        required=   False,
        error_messages  = {
            'required' : _('Birthday is required.')
        }

    )
    gender            = forms.CharField(
        label   =   _('Gender'),
        widget  =   forms.Select(choices=_genders)
    )
    bio             = forms.CharField(required=False, widget=forms.Textarea(attrs={'rows' : '4'}))

    class Meta:
        model = User
        fields = ('first_name', 'last_name', 'bio', 'birthday', 'gender', 'email',)



    def __init__(self, *args, **kwargs):
        super(UserProfileForm, self).__init__(*args, **kwargs)



        if self.instance:
            self.fields['email'].widget.attrs['readonly'] = True
            self.fields['birthday'].initial = self.instance.get_profile().birthday
            self.fields['bio'].initial = self.instance.get_profile().bio

        for i in self.fields:
            if isinstance(self.fields[i], forms.CharField):
                self.fields[i].widget.attrs["class"]       = 'input-xlarge'

    def save(self, *args, **kw):
        super(UserProfileForm, self).save(*args, **kw)
        self.instance.get_profile().bio           = self.cleaned_data.get('bio')
        self.instance.get_profile().birthday      = self.cleaned_data.get('birthday')
        self.instance.get_profile().save()

Выше работало нормально, прямо сейчас. При инициализации формы, он извлекает начальные значения био, дня рождения из профиля.

но при сохранении он движется без каких-либо действий. Моя модель профиля очень проста, и метод сохранения там не изменился, он использует оригинальные операции от моделей. Модель

Кто-нибудь может посоветовать, почему это происходит?

PS ошибка не возвращается, просто ничего не сохраняется

Обновление (добавлен класс ExtendedMetaModelForm):

class ExtendedMetaModelForm(forms.ModelForm):
    """
    Allow the setting of any field attributes via the Meta class.
    """
    def __init__(self, *args, **kwargs):
        """
        Iterate over fields, set attributes from Meta.field_args.
        """
        super(ExtendedMetaModelForm, self).__init__(*args, **kwargs)
        if hasattr(self.Meta, "field_args"):
            # Look at the field_args Meta class attribute to get
            # any (additional) attributes we should set for a field.
            field_args = self.Meta.field_args
            # Iterate over all fields...
            for fname, field in self.fields.items():
                # Check if we have something for that field in field_args
                fargs = field_args.get(fname)
                if fargs:
                    # Iterate over all attributes for a field that we
                    # have specified in field_args
                    for attr_name, attr_val in fargs.items():
                        if attr_name.startswith("+"):
                            merge_attempt = True
                            attr_name = attr_name[1:]
                        else:
                            merge_attempt = False
                        orig_attr_val = getattr(field, attr_name, None)
                        if orig_attr_val and merge_attempt and\
                           type(orig_attr_val) == dict and\
                           type(attr_val) == dict:
                            # Merge dictionaries together
                            orig_attr_val.update(attr_val)
                        else:
                            # Replace existing attribute
                            setattr(field, attr_name, attr_val)

2 ответа

Решение

В 1.5 AUTH_PROFILE_MODULE а также get_profile были объявлены устаревшими из-за введения пользовательских моделей пользователей.

Как указывает @Ngenator, вы используете устаревшие функции. Вы можете попробовать создать кастом User модель

В settings.py

AUTH_USER_MODEL = 'myapp.MyUser'

в myapp.MyUser создать нового пользователя с указанными вами атрибутами

class MyUser(AbstractBaseUser):

    bio = TextField()
    birthday = DateField()

и вам нужно избавиться от get_profile() из вашей формы.

def save(self, *args, **kw):

    self.instance.bio           = self.cleaned_data.get('bio')
    self.instance.birthday      = self.cleaned_data.get('birthday')

    super(UserProfileForm, self).save(*args, **kw)

Обратите внимание - это, вероятно, разрушит большую часть структуры вашей БД и потребует значительных обновлений!! Вы действительно нуждаетесь в django 1.5?

Другие вопросы по тегам