繁体   English   中英

获取 TypeError:Form.__init__() 缺少 1 个必需的位置参数:“请求”,即使我在 GET 和 POST 方法中都传递了请求

[英]Getting TypeError: Form.__init__() missing 1 required positional argument: ‘request’ even though I have passed request in both GET and POST methods

我有一个表单,我正在使用HttpRequest object 在其__init__()方法中从视图中传递一些数据来初始化它的字段,以显示在前端。 即使,我在GETPOST方法中都通过了HttpRequest object 命名request ,但在POST请求中仍然出现以下错误:

TypeError at /accounts/invite-user/cancel/
InviteUserCancelForm.__init__() missing 1 required positional argument: 'request'

错误的完整细节是:

Traceback Switch to copy-and-paste view
D:\Projects\meistery\venvs\inviteandresetpass\lib\site-packages\django\core\handlers\exception.py, line 55, in inner
                response = get_response(request) …
Local vars
D:\Projects\meistery\venvs\inviteandresetpass\lib\site-packages\django\core\handlers\base.py, line 197, in _get_response
                response = wrapped_callback(request, *callback_args, **callback_kwargs) …
Local vars
D:\Projects\meistery\venvs\inviteandresetpass\lib\site-packages\django\views\generic\base.py, line 84, in view
            return self.dispatch(request, *args, **kwargs) …
Local vars
D:\Projects\meistery\venvs\inviteandresetpass\lib\site-packages\django\contrib\auth\mixins.py, line 73, in dispatch
        return super().dispatch(request, *args, **kwargs) …
Local vars
D:\Projects\meistery\venvs\inviteandresetpass\lib\site-packages\django\contrib\auth\mixins.py, line 109, in dispatch
        return super().dispatch(request, *args, **kwargs) …
Local vars
D:\Projects\meistery\venvs\inviteandresetpass\lib\site-packages\django\views\generic\base.py, line 119, in dispatch
        return handler(request, *args, **kwargs) …
Local vars
D:\Projects\meistery\venvs\inviteandresetpass\lib\site-packages\django\views\generic\edit.py, line 151, in post
        form = self.get_form() …
Local vars
D:\Projects\meistery\venvs\inviteandresetpass\lib\site-packages\django\views\generic\edit.py, line 39, in get_form
        return form_class(**self.get_form_kwargs()) …

我的forms.py是:

class InviteUserCancelForm(forms.Form):
    invitations = forms.ChoiceField(
        widget=forms.RadioSelect,
        choices=(('test_invite','test_invite'),)
    )

    def __init__(self, request: HttpRequest, *args, **kwargs):
        super (InviteUserCancelForm, self).__init__(*args, **kwargs)

        if "invitations" in args:
            self.fields['invitations'] = forms.ChoiceField(
            label="Your Invitations",
            widget=forms.RadioSelect,
            choices=request["invitations"]
            )
        else:
            self.fields['invitations'] = forms.ChoiceField(
                label="Your Invitations",
                widget=forms.RadioSelect,
                choices=request.session["invitations"]
            )

我的views.py是:

class InviteUserCancel(LoginRequiredMixin, PermissionRequiredMixin, FormView):
    permission_required = ("accounts.workspace.can_view", "accounts.workspace.can_change")
    permission_denied_message = "ACCESS DENIED: Only Administrators or Workspace \
                                    Administrators can view this page."
    template_name = "accounts/invite-user-cancel.html"
    extra_context = {"title": "Invitation Sent"}
    form_class = InviteUserCancelForm
    success_url = "/accounts/invite-user/cancel/done/"

    def get(self, request):
        invites = Invitation.objects.filter(created_by=request.user)

        if request.user.is_superuser:
            invites = Invitation.objects.all()

        invitations = []

        for invite in invites:
            invitations.append(tuple((invite.pk, invite.__str__()),))

        self.object = tuple(invitations)

        request.session["invitations"] = self.object

        form = InviteUserCancelForm(request)

        return self.render_to_response(self.get_context_data(form=form))

    def form_invalid(self, form, request):
        messages.error(
            request,
            "ERROR: You did not fill all the fields of the form \
                         or you did not fill the form properly."
        )
        return self.render_to_response(self.get_context_data(form=form))

    def form_valid(self, form, request):        
        try:
            invitation = self.model.objects.get(pk=int(form["invitations"]))
            invitation.cancel()
            return HttpResponseRedirect(self.get_success_url())
        except Invitation.DoesNotExist:
            form = InviteUserCancelForm(request, request.POST)
            return self.form_invalid(form, request)

我在做什么错?

我删除了覆盖的valid_form()方法,而是覆盖了post()方法,它现在工作正常。

下面是我post()方法:

def post(self, request):
        form = InviteUserCancelForm(request, request.POST)

        if not form.is_valid():
            return self.form_invalid(form, request)

        try:
            invitation = Invitation.objects.get(pk=int(form.cleaned_data.get("invitations")))
            invitation.cancel()
            return self.form_valid(form)
        except Invitation.DoesNotExist:
            return self.form_invalid(form, request)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM