2

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

私はurls定義を置き換え、accounts/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

userena / views.py / profile_editメソッドのdictに(クラスベースのビューです):

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からアプリaccounts/views.pyにコピーする代わりに別の方法はありますか?

ヒントやアドバイスをいただければ幸いです。ありがとうございます。

4

0 に答える 0