简体   繁体   English

Django测试form.is_valid()

[英]Django testing form.is_valid()

My view have optional parameter in url. 我的视图在url中具有可选参数。 I pass this parameter ( <int:jobNr> / None )to form in get_form_kwargs 我传递此参数( <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'))

In form __init__ If url /foo/jobNr/ create self.jobNr with url parameter. 格式为__init__如果url /foo/jobNr/使用url参数创建self.jobNr If url /foo/ create new field. 如果是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

And now i want to code tests for a form. 现在我想为表单编码测试。 This is what i tried 这就是我尝试过的

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

And this is what i get AttributeError: 'Job' object has no attribute 'disabled' After 5h i need help. 这就是我得到的AttributeError: 'Job' object has no attribute 'disabled'之后,我需要帮助。 I have no idea anymore. 我不知道了

you can't assign job to a form field (that's what form.fields['jobWorker'] is). 您无法将job分配给表单字段(这就是form.fields['jobWorker']是)。 If you want to assign an initial value, you should do: 如果要分配初始值,则应执行以下操作:

form.fields['jobWorker'].initial = job

But I think you want to pass job as the chosen model, you should just do that in data: 但是我认为您希望通过job作为所选模型,您应该只在数据中执行此操作:

form_data = {'description': 'description', 'hours': 20, 'jobWorker': job.pk}
form = AddHoursForm(form_data)
self.assertFalse(form.is_valid)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM