首页 > 解决方案 > ModelForm form_valid() 函数的成功/重定向 URL 问题

问题描述

我在重写 a 的form_valid()方法时遇到了一些困难CreateView

我有一个ModelForm用户可以注册新患者的地方。表单由CreateView. 我已经覆盖了form_valid()视图的方法,因为我首先需要将用户与患者联系起来,然后评估患者的详细信息(即表单中的数据)是否符合某些标准。如果不满足标准,则不会保存患者/表格,并且用户会收到错误消息。如果他们符合条件,则保存患者/表格,并且用户会收到成功消息。表单/视图的此功能正在工作 - 在下面的测试代码中,我有一个布尔值“is_eligible”,稍后我将用它代替适当的标准。当is_eligible == True模型保存时我收到一条成功消息,当它== False不保存时我收到error消息。

如果患者不符合条件,我的问题是处理成功 url 和重定向。我希望它回到我设置的“仪表板”,但每次我都会得到一个

DisallowedRedirect at /dashboard/patients/register
Unsafe redirect URL with protocol 'accounts'

如果有人可以提供有关如何完成这项工作的见解/建议,将不胜感激。

我当前的代码:

表格.py

class PatientRegisterForm(forms.ModelForm):
    class Meta:
        model = Patient
        fields = ['first_name', 'last_name', 'is_eligible']

视图.py

class PatientRegisterView(LoginRequiredMixin, CreateView):
    model = Patient
    form_class = PatientRegisterForm
    template_name = 'patients/register.html'
    success_url = 'accounts:dashboard'

    def patient_eligible(self, test):
        if not test.is_eligible:
            return False
        else:
            return True

    def form_valid(self, form):
        form.instance.provider = self.request.user
        test = form.save(commit=False)
        if self.patient_eligible(test):
            messages.success(self.request, 'Patient registered successfully!')
            test.save()
            return super().form_valid(form) # fails here if eligible
        else:
            messages.error(self.request, 'Patient not registered')
            return redirect(self.request, 'accounts:dashboard') # fails here if not eligible

标签: pythondjangodjango-modelsdjango-forms

解决方案


首先,我认为您不需要将 self.request 作为重定向的第一个参数传递。
文档重定向应该是这样的

redirect(to, permanent=False, *args, **kwargs)

但是导致您的错误的真正问题是您没有反转 url。你需要做的是:

from django.shorcts import reverse_lazy
..
success_url = reverse_lazy('accounts:dashboard')
..
return redirect(reverse('accounts:dashboard'))

推荐阅读