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())

这就是我在5H之后获得的AttributeError: 'Job' object has no attribute 'disabled',我需要帮助。我不知道了。

您无法将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)

相关内容

最新更新