Python ModelForm form_valid()函数的成功/重定向URL有问题

Python ModelForm form_valid()函数的成功/重定向URL有问题,python,django,django-models,django-forms,Python,Django,Django Models,Django Forms,我在重写CreateView的form\u valid()方法时遇到了一些困难 我有一个ModelForm,用户可以在其中注册新患者。表单由CreateView处理。我已经覆盖了视图的form\u valid()方法,因为我首先需要将用户分配给患者,然后评估患者的详细信息(即表单中的数据)是否符合某些标准。如果不符合条件,则不会保存患者/表单,用户会收到错误消息。如果符合条件,则保存患者/表单,用户将收到一条成功消息。 表单/视图的这一功能正在发挥作用-在下面的测试代码中,我有一个布尔值“is_

我在重写
CreateView
form\u valid()
方法时遇到了一些困难

我有一个
ModelForm
,用户可以在其中注册新患者。表单由
CreateView
处理。我已经覆盖了视图的
form\u valid()
方法,因为我首先需要将用户分配给患者,然后评估患者的详细信息(即表单中的数据)是否符合某些标准。如果不符合条件,则不会保存患者/表单,用户会收到错误消息。如果符合条件,则保存患者/表单,用户将收到一条成功消息。 表单/视图的这一功能正在发挥作用-在下面的测试代码中,我有一个布尔值“is_Qualified”,稍后我将用它代替适当的标准。当
符合条件==True
时,模型保存,我收到一条成功消息;当
==False
时,它不保存,我收到
错误
消息

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

DisallowedRedirect at /dashboard/patients/register
Unsafe redirect URL with protocol 'accounts'
如果有人能就如何完成这项工作提供见解/建议,将不胜感激

我当前的代码:

forms.py

class PatientRegisterForm(forms.ModelForm):
    class Meta:
        model = Patient
        fields = ['first_name', 'last_name', 'is_eligible']
views.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

首先,我认为您不需要将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'))

当我定义
success\u url=reverse('accounts:dashboard')
时,这似乎导致了循环导入错误。dev服务器崩溃,最后一行声明所包含的URLconf“project.url”中似乎没有任何模式。如果您在文件中看到有效的模式,那么问题可能是由循环导入引起的。好的,我也有解决方法,请使用lazy。请参阅更新的答案