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。请参阅更新的答案