Обновление метода сохранения формы 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?