我有一个基于CreateView的访问创建类。它从 URL 访问组织,因此它作为关键字 arg 传入。
class VisitCreate(LoginRequiredMixin, UserOrgRequiredMixin, CreateView):
model = models.Visit
form_class = VisitCreateForm
# template_name is "visit_form.html" from CreateView
def form_valid(self, form):
# get the patient for this visit
patient = models.Patient.get_by_pk(self.kwargs['patientId'])
if not patient or patient.organization.name != self.kwargs['orgStr']:
raise SuspiciousOperation('Patient does not exist')
我想编写一个表单字段验证器来检查有关访问的某些内容,但它需要 orgStr。这是当前的表单字段验证器,但它无法获取 orgStr:
class VisitCreateForm(ModelForm):
class Meta:
model = models.Visit
...
# Allow only one visit per day
def clean_visit_date(self):
visit_date = self.cleaned_data['visit_date']
if models.Visit.get_visits(visit_date, visit_date, self.kwargs['orgStr']):
raise ValidationError('There is already a visit on this date')
如何在visit_date 上标记字段错误?要么我必须以某种方式将 orgStr 传递给表单,要么在 VisitCreate.form_valid 中标记字段错误。
请不要建议将 orgStr 添加为表单中的隐藏字段。这似乎很疯狂。
您可以覆盖视图的get_form_kwargs
方法以orgStr
从 URL传递:
class VisitCreate(LoginRequiredMixin, UserOrgRequiredMixin, CreateView):
def get_form_kwargs(self):
kwargs = super(VisitCreate, self).get_form_kwargs()
kwargs['orgStr'] = self.kwargs['orgStr']
return kwargs
然后,您需要覆盖表单的__init__
方法来处理orgStr
.
class VisitCreateForm(ModelForm):
...
def __init__(self, *args, **kwargs):
self.orgStr = kwargs.pop('orgStr')
super(VisitCreateForm, self).__init__(*args, **kwargs)
# You can now access `self.orgStr` in the `clean_visit_date` method.
def clean_visit_date(self):
visit_date = self.cleaned_data['visit_date']
if models.Visit.get_visits(visit_date, visit_date, self.orgStr):
raise ValidationError('There is already a visit on this date')
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句