Форма редактирования django userena со связанными дополнительными полями
У меня есть некоторые проблемы, которые нужно решить с помощью редактирования профиля django-userena. Я хочу использовать EditProfileFormExtra (это расширение userena EditProfileForm), чтобы редактировать связанные дополнительные поля (поля выбора) для модели настроек, которые находятся в связи OneToOne с приложением учетных записей, поле: default_house_system.
Сохранение в порядке, но начальное значение default_house_system не работает, всегда отображается первое значение кортежа. Я хочу сделать это без включения какого-либо кода в оригинальные файлы в Django-Userena.
Модели:
class UserProfile(UserenaBaseProfile):
user = models.OneToOneField(User,
unique=True,
verbose_name='user',
related_name='user_profile')
settings = models.OneToOneField(Settings, unique=True, verbose_name="Ustawienia", blank=True, null=True)
is_virtual = models.BooleanField(default=False)
class Settings(models.Model):
points = models.IntegerField(default=0)
default_house_system = models.CharField(choices=HOUSE_SYSTEMS, max_length=24, default="Placidus")
Форма Userena:
class EditProfileForm(forms.ModelForm):
""" Base form used for fields that are always required """
first_name = forms.CharField(label=_(u'First name'),
max_length=30,
required=False)
last_name = forms.CharField(label=_(u'Last name'),
max_length=30,
required=False)
def __init__(self, *args, **kw):
super(EditProfileForm, self).__init__(*args, **kw)
# Put the first and last name at the top
new_order = self.fields.keyOrder[:-2]
new_order.insert(0, 'first_name')
new_order.insert(1, 'last_name')
self.fields.keyOrder = new_order
class Meta:
model = get_profile_model()
exclude = ['user']
def save(self, force_insert=False, force_update=False, commit=True):
profile = super(EditProfileForm, self).save(commit=commit)
# Save first and last name
user = profile.user
user.first_name = self.cleaned_data['first_name']
user.last_name = self.cleaned_data['last_name']
user.save()
Я заменяю определение URL-адреса, добавляя в account / urls.py:
url(r'^(?P<username>[\.\w]+)/edit/$',
'userena.views.profile_edit',
{'edit_profile_form': EditProfileFormExtra},
name='userena_profile_edit'),
... и вот определение EditProfileFormExtra:
class EditProfileFormExtra(EditProfileForm):
default_house_system = forms.ChoiceField(choices=HOUSE_SYSTEMS)
def __init__(self, *args, **kw):
super(EditProfileFormExtra, self).__init__(*args, **kw)
new_order = self.fields.keyOrder[:-1]
new_order.insert(3, 'default_house_system')
self.fields.keyOrder = new_order
class Meta:
model = get_profile_model()
fields = ['mugshot', 'default_house_system']
def save(self, force_insert=False, force_update=False, commit=True):
profile = super(EditProfileFormExtra, self).save(commit=commit)
settings_profile = profile.settings
settings_profile.default_house_system = self.cleaned_data['default_house_system']
settings_profile.save()
profile.save()
return profile
Теперь ВАЖНЫЕ вещи. Если я поставлю:
'default_house_system': user.user_profile.settings.default_house_system
в dict в методе userena/views.py/profile_edit (это представление на основе классов):
user_initial = {'first_name': user.first_name,
'last_name': user.last_name,
'default_house_system': user.user_profile.settings.default_house_system}
это отлично работает! Но я не хочу включать какой-либо код в исходные файлы в Django-Userena.
Есть ли другой способ вместо копирования всего метода profile_edit из userena / views.py в мое приложение account /views.py?
Буду признателен за любые советы или советы, спасибо.