Django 测试 form.is_valid()
Django testing form.is_valid()
我的视图在 url 中有可选参数。我将此参数 (<int:jobNr>
/None
) 传递到 get_form_kwargs
中
class AddHoursView(LoginRequiredMixin, generic.CreateView):
form_class = AddHoursForm
def get_form_kwargs(self):
# pass "jobNr" keyword argument from current url to form
kwargs = super(AddHoursView, self).get_form_kwargs()
kwargs[JOB_PARAM] = self.kwargs.get(JOB_PARAM)
return kwargs
def form_valid(self, form):
self.object = form.save(commit = False)
# If url/jobNR take jobNr from URL, if not take from form
try:
jobNr = self.kwargs[JOB_PARAM]
except KeyError:
jobNr = form.cleaned_data[JOB_WORKER].jobNr
job = models.Job.objects.get(jobNr = jobNr)
jobWorker = models.JobWorker.objects.get_or_create(job = job,
user = self.request.user)
self.object.jobWorker = jobWorker[0]
self.object.save()
return HttpResponseRedirect(reverse('worktime:myjobs'))
在形式 __init__
如果 url /foo/jobNr/
使用 url 参数创建 self.jobNr
。如果 url /foo/
创建新字段。
class AddHoursForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
#Add jobworker field to from Worktime model if any jobNr pass in url
#When in url will be parameter. Job foreignkey will be set by automat.
self.jobNr = kwargs.pop(JOB_PARAM, None)
super(AddHoursForm, self).__init__(*args, **kwargs)
if not self.jobNr:
self.fields[JOB_WORKER] = forms.ModelChoiceField(queryset=Job.objects.all())
def clean(self):
cleaned_data = super().clean()
date = cleaned_data.get('date')
if self.jobNr:
jobDate = Job.objects.get(jobNr=self.jobNr).start
elif not cleaned_data.get(JOB_WORKER).start:
raise forms.ValidationError("Dat work don't start yet")
else:
jobDate = cleaned_data.get(JOB_WORKER).start
if date<jobDate:
raise forms.ValidationError("Wrong date")
return cleaned_data
现在我想编写表单测试代码。这是我试过的
def test_no_jobNr_in_url_and_no_date(self):
job = Job.objects.create(jobNr = 1, street = 'a', city = 'a',
zip = 'a')
form_data = {'description': 'description', 'hours': 20}
form = AddHoursForm(form_data)
# Override field jobWorker after __init__ form
form.fields['jobWorker'] = job
self.assertFalse(form.is_valid())
这就是我得到的 AttributeError: 'Job' object has no attribute 'disabled'
5 小时后我需要帮助。我不知道了。
您不能将 job
分配给表单域(form.fields['jobWorker']
就是这样)。如果你想分配一个初始值,你应该这样做:
form.fields['jobWorker'].initial = job
但我认为您想将 job
作为所选模型传递,您应该只在数据中这样做:
form_data = {'description': 'description', 'hours': 20, 'jobWorker': job.pk}
form = AddHoursForm(form_data)
self.assertFalse(form.is_valid)
我的视图在 url 中有可选参数。我将此参数 (<int:jobNr>
/None
) 传递到 get_form_kwargs
class AddHoursView(LoginRequiredMixin, generic.CreateView):
form_class = AddHoursForm
def get_form_kwargs(self):
# pass "jobNr" keyword argument from current url to form
kwargs = super(AddHoursView, self).get_form_kwargs()
kwargs[JOB_PARAM] = self.kwargs.get(JOB_PARAM)
return kwargs
def form_valid(self, form):
self.object = form.save(commit = False)
# If url/jobNR take jobNr from URL, if not take from form
try:
jobNr = self.kwargs[JOB_PARAM]
except KeyError:
jobNr = form.cleaned_data[JOB_WORKER].jobNr
job = models.Job.objects.get(jobNr = jobNr)
jobWorker = models.JobWorker.objects.get_or_create(job = job,
user = self.request.user)
self.object.jobWorker = jobWorker[0]
self.object.save()
return HttpResponseRedirect(reverse('worktime:myjobs'))
在形式 __init__
如果 url /foo/jobNr/
使用 url 参数创建 self.jobNr
。如果 url /foo/
创建新字段。
class AddHoursForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
#Add jobworker field to from Worktime model if any jobNr pass in url
#When in url will be parameter. Job foreignkey will be set by automat.
self.jobNr = kwargs.pop(JOB_PARAM, None)
super(AddHoursForm, self).__init__(*args, **kwargs)
if not self.jobNr:
self.fields[JOB_WORKER] = forms.ModelChoiceField(queryset=Job.objects.all())
def clean(self):
cleaned_data = super().clean()
date = cleaned_data.get('date')
if self.jobNr:
jobDate = Job.objects.get(jobNr=self.jobNr).start
elif not cleaned_data.get(JOB_WORKER).start:
raise forms.ValidationError("Dat work don't start yet")
else:
jobDate = cleaned_data.get(JOB_WORKER).start
if date<jobDate:
raise forms.ValidationError("Wrong date")
return cleaned_data
现在我想编写表单测试代码。这是我试过的
def test_no_jobNr_in_url_and_no_date(self):
job = Job.objects.create(jobNr = 1, street = 'a', city = 'a',
zip = 'a')
form_data = {'description': 'description', 'hours': 20}
form = AddHoursForm(form_data)
# Override field jobWorker after __init__ form
form.fields['jobWorker'] = job
self.assertFalse(form.is_valid())
这就是我得到的 AttributeError: 'Job' object has no attribute 'disabled'
5 小时后我需要帮助。我不知道了。
您不能将 job
分配给表单域(form.fields['jobWorker']
就是这样)。如果你想分配一个初始值,你应该这样做:
form.fields['jobWorker'].initial = job
但我认为您想将 job
作为所选模型传递,您应该只在数据中这样做:
form_data = {'description': 'description', 'hours': 20, 'jobWorker': job.pk}
form = AddHoursForm(form_data)
self.assertFalse(form.is_valid)