1

私は Django 1.4 で Django-Profiles を使用しています。ユーザーの登録を解除する方法が必要なので、ユーザーはメールの受信を停止できます。

私の UserProfile モデルのフィールドの 1 つは user_type で、USER_TYPES の選択肢があります。ユーザーが登録を解除したとしても、ユーザーをシステムに留めておくために、USER_TYPES の 1 つを InactiveClient にすることに決め、次のようなチェックボックスを含めます。

Models.py:

USER_TYPES = (
    ('Editor', 'Editor'),
    ('Reporter', 'Reporter'),
    ('Client', 'Client'),
    ('InactiveClient', 'InactiveClient'),
    ('InactiveReporter', 'InactiveReporter'),
)

class UserProfile(models.Model):
    user = models.OneToOneField(User, unique=True)
    user_type = models.CharField(max_length=25, choices=USER_TYPES, default='Client')
    ... etc.

フォーム.py

class UnsubscribeForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(UnsubscribeForm, self).__init__(*args, **kwargs)
        try:
            self.initial['email'] = self.instance.user.email
            self.initial['first_name'] = self.instance.user.first_name
            self.initial['last_name'] = self.instance.user.last_name
        except User.DoesNotExist:
            pass
    email = forms.EmailField(label='Primary Email')
    first_name = forms.CharField(label='Editor first name')
    last_name = forms.CharField(label='Editor last name')    
    unsubscribe = forms.BooleanField(label='Unsubscribe from NNS Emails')

    class Meta:
        model = UserProfile
        fields = ['first_name','last_name','email','unsubscribe']

    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']
        if self.unsubscribe:
            u.get_profile().user_type = 'InactiveClient'
        u.save()
        client = super(UnsubscribeForm, self).save(*args,**kwargs)
        return client

編集:追加のコード コンテキストを追加しました。self.unsubscribe: が save() オーバーライドにある場合。それは別の場所にあるべきですか?ありがとうございました。

Edit2: UnsubscribeForm をいくつかの方法で変更しようとしました。今、私は 404 を取得します。指定されたクエリに一致するユーザーはありません。しかし、呼び出されているビュー関数は他のフォームでも機能するので、理由はわかりませんか?

urls.py

urlpatterns = patterns('',
    url('^client/edit', 'profiles.views.edit_profile',
        {
            'form_class': ClientForm,
            'success_url': '/profiles/client/edit/',
        },
        name='edit_client_profile'),
    url('^unsubscribe', 'profiles.views.edit_profile',
        {
            'form_class': UnsubscribeForm,
            'success_url': '/profiles/client/edit/',
        },
        name='unsubscribe'),
        )

これら 2 つの URL は同じビューを呼び出していますが、異なる form_class を使用しています。

Edit3: 理由はわかりませんが、購読解除 URL から末尾のスラッシュを削除すると、フォームが最終的に読み込まれます。しかし、フォームを送信すると、まだエラーが発生します: 'UnsubscribeForm' object has no attribute 'unsubscribe'知っておいてください。しかし、今のところ、フォームは読み込まれますが、送信されず、フォームの次の行でトレースが終了します。

if self.unsubscribe:
4

1 に答える 1

0

もう一度自分の質問に答えます。ModelForms では、モデルに存在しないフォーム要素を追加し、save メソッドで self.cleaned_data['form_element_name'] にアクセスすることで、それらのフィールドの値にアクセスできます。

これは私の保存方法がどのように見えるかです:

def save(self, *args, **kwargs):
    u = self.instance.user
    p = self.instance.user.get_profile()
    u.email = self.cleaned_data['email']
    u.first_name = self.cleaned_data['first_name']
    u.last_name = self.cleaned_data['last_name']
    if self.cleaned_data['unsubscribe']:
        p.user_type = 'InactiveClient'
    u.save()
    p.save()
    client = super(UnsubscribeForm, self).save(*args,**kwargs)
    return client
于 2013-07-17T14:33:15.847 に答える