2

最近、1.2からDjango1.4にアップデートしました。

移行中にset_messagesは非推奨になり、メッセージAPIがadd_messageに変更されました。このページに基づいて、次の形式を使用する必要があります。

messages.add_message(request, messages.INFO, 'Hello world.')

ただし、エラーが発生しますglobal name 'request' is not defined。誰もが理由を知っていますか?

これが私のコードです(太字で問題を引き起こしている行)

class InviteFriendForm(UserForm):

to_user = forms.CharField(widget=forms.HiddenInput)
message = forms.CharField(label="Message", required=False, widget=forms.Textarea(attrs = {'cols': '20', 'rows': '5'}))

    def clean_to_user(self):
        to_username = self.cleaned_data["to_user"]
        try:
            User.objects.get(username=to_username)
        except User.DoesNotExist:
            raise forms.ValidationError(u"Unknown user.")

        return self.cleaned_data["to_user"]

    def clean(self):
        to_user = User.objects.get(username=self.cleaned_data["to_user"])
        previous_invitations_to = FriendshipInvitation.objects.invitations(to_user=to_user, from_user=self.user)
        if previous_invitations_to.count() > 0:
            raise forms.ValidationError(u"Already requested friendship with %s" % to_user.username)
        # check inverse
        previous_invitations_from = FriendshipInvitation.objects.invitations(to_user=self.user, from_user=to_user)
        if previous_invitations_from.count() > 0:
            raise forms.ValidationError(u"%s has already requested friendship with you" % to_user.username)
        return self.cleaned_data

    def save(self):
        to_user = User.objects.get(username=self.cleaned_data["to_user"])
        message = self.cleaned_data["message"]
        invitation = FriendshipInvitation(from_user=self.user, to_user=to_user, message=message, status="2")
        invitation.save()
        if notification:
            notification.send([to_user], "friends_invite", {"invitation": invitation})
            notification.send([self.user], "friends_invite_sent", {"invitation": invitation})
            **messages.add_message(request, messages.SUCCESS, "Friendship requested with %s" % to_user.username)**
        return invitation

トレースバック:

Traceback:
File "/Users/nb/Desktop/myenv2/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response
  111.                         response = callback(request, *callback_args, **callback_kwargs)
File "/Users/nb/Desktop/nutstore/apps/profiles/views.py" in profile
  125.                     invite_form.save()
File "/Users/nb/Desktop/nutstore/apps/friends/forms.py" in save
  81.             messages.add_message(request, messages.SUCCESS, "Friendship requested with %s" % to_user.username)

Exception Type: NameError at /profiles/profile/test/
Exception Value: global name 'request' is not defined
4

1 に答える 1

5

Djangoフォームは現在のリクエストにアクセスできません。これは、コンポーネント間の結合を減らすための意図的な設計上の決定ですが、利便性が犠牲になります。

このように、スコープに要求変数がないNameErrorため、を取得します。内でリクエストを使用する場合は、ある時点でリクエストを渡す必要があります。たとえば、save()

class InviteFriendForm(forms.Form):
    def save(self, request):
        # ...

# view
form.save(request)
于 2012-11-20T03:38:48.853 に答える