【问题标题】:Django - 'JobProficienciesFormFormSet' object is not callableDjango - 'JobProficienciesFormFormSet' 对象不可调用
【发布时间】:2013-12-16 23:34:51
【问题描述】:

我在尝试edit 具有常规formformset 的模板中的表单时遇到问题,当我尝试保存更新行时收到此错误。页面正确填充。我不确定主要错误是什么。

python 中的回溯说明:

'JobProficienciesFormFormSet' object is not callable
At line 100:  form = proficiencies_formset(request.POST) 

这是我的代码:

views.py

@login_required(login_url='/login/')
def edit(request, jobid):

    # Get the job so we can edit. Also, for checking if the company logged in is valid
    job = Jobs.objects.get(id=jobid)

    # Permission check
    if job.user_id == request.user.id:

        # Get associated Job Proficiencies IDs attached to a Job
        profid = JobProficiencies_Proficiencies.objects.filter(job_id=jobid).select_related('job_proficiencies_id')
        # Get the Proficiency values attached to the job
        qset = JobProficiencies.objects.filter(id__in=profid).select_related('job_proficiency', 'proficiency_required', 'comfort_level')

        job_proficiencies = modelformset_factory(JobProficiencies, max_num=10, extra=0)
        proficiencies_formset = job_proficiencies(queryset=qset)

        args = {}
        args.update(csrf(request))
        args = {
            'id': jobid,
            'job': JobForm(instance=job),
            'job_proficiencies_formset': proficiencies_formset,
        }

        if request.method == 'POST':
            job = JobForm(request.POST, instance=job)
            form = proficiencies_formset(request.POST)

            if job.is_valid() and proficiencies_formset.is_valid():

                m_tags = job.cleaned_data['m_tags']
                _job = job.save(commit=False)
                _job.id = jobid
                _job.dateUpdated = datetime.now()
                _job.save()

                # Save proficiencies
                for f in form:
                    job_proficiency = f.save(commit=False)
                    job_proficiency.save()
                    JobProficiencies_Proficiencies.objects.update(job_id=_job.id, job_proficiencies_id=job_proficiency.id)

                # Without this next line the tags won't be saved.
                for m_tag in m_tags:
                    job.tags.add(m_tag)

                messages.success(request, "Job Edited!")
                return HttpResponseRedirect('/job/all/')

            else:
                messages.error(request, "There are form errors!")
                return render_to_response('job/edit.html/', args, context_instance=RequestContext(request))

        return render_to_response('job/edit.html', args, context_instance=RequestContext(request))

    HttpResponseRedirect('job/all/')

forms.py

class JobForm(forms.ModelForm):

    m_tags = TagField()
    class Meta:
        model = Jobs
        fields = ('title', 'about', 'wage', 'gitHubLink')

    def save(self, commit=True):
        job = super(JobForm, self).save(commit=False)
        job.title = self.cleaned_data['title']
        job.about = self.cleaned_data['about']
        job.wage = self.cleaned_data['wage']
        job.gitHubLink = self.cleaned_data['gitHubLink']
        job.dateUpdated = datetime.now()
        job.status = 'JO'

        if commit:
            job.save()
        return job


class JobProficienciesForm(forms.ModelForm):

    class Meta:
        model = JobProficiencies
        fields = ('job_proficiency', 'proficiency_required', 'comfort_level')

    def save(self, commit=True):
        jobproficiency = super(JobProficienciesForm, self).save(commit=False)
        jobproficiency.job_proficiency = self.cleaned_data['job_proficiency']
        jobproficiency.proficiency_required = self.cleaned_data['proficiency_required']
        jobproficiency.comfort_level = self.cleaned_data['comfort_level']

        if commit:
            jobproficiency.save()
        return jobproficiency

同样,模板填充正确。错误在于保存编辑。这就是我卡住的地方。非常感谢任何帮助。谢谢!

编辑这是我在模板中显示表单集的方式:

                {{ job_proficiencies_formset.management_form }}
                {% for p in job_proficiencies_formset %}
                    {{ p.id }}
                    <div class="row item">
                        <div class="col-md-5">
                            {{ p.job_proficiency|add_class:"form-control" }}
                        </div>
                        <div class="col-md-3">
                            {{ p.comfort_level|add_class:"form-control" }}
                        </div>
                        <div class="col-md-3">
                            {{ p.proficiency_required|add_class:"form-control" }}
                        </div>
                        <div class="col-md-1">
                            <p><a id="delete-row" class="delete-row" href="#"><i class="fa fa-trash-o fa-2x"></i></a></p>
                        </div>
                    </div>
                {% endfor %}

【问题讨论】:

    标签: django python-2.7 django-models django-forms django-views


    【解决方案1】:

    在代码中,proficiencies_formset 是一个表单集对象,而不是一个类。

            proficiencies_formset = job_proficiencies(queryset=qset)
    ...
            form = proficiencies_formset(request.POST)
    

    我认为你的意思是:

            proficiencies_formset = job_proficiencies(request.POST)
    

    然后:

                # Save proficiencies
                for f in proficiencies_formset:
    

    这种事情是我喜欢保持使用大写字母开始类名的惯例的原因之一,即使类是由工厂构造的。

    【讨论】:

    • 你好彼得!非常感谢您,这消除了错误,我明白您的意思。当我学习 Django 时,我的命名约定几乎无处不在。 :) 我打算回去重构名字。
    • 进行您所说的更改时,这是可行的。但是,现在我收到了错误:MultiValueDictKeyError at line 96: if job.is_valid() and proficiencies_formset.is_valid(): 我对表单集很陌生,所以我认为这与此有关?
    • 如何在模板中呈现表单?我认为我从来没有遇到过那个特定的错误,但是表单集有一些特殊的渲染要求——这是一个需要检查的地方。另外,我看到一些对子类模型的特殊要求的引用 - JobProficiencies 是非抽象类的子类吗?
    • 对命名约定表示歉意。 JobProficiencies 是一个 model,用于存储与工作相关的熟练程度。这是我在模板中呈现表单的方式。环顾四周,似乎如果我通过表单传递p.id,它应该删除MultiValueDictKeyError,因为在保存表单并进行验证时没有设置。
    • 彼得,请查看我对最初问题的编辑,了解我如何在模板中显示表单集。感谢您的帮助。
    猜你喜欢
    • 2011-06-07
    • 2021-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-26
    • 2021-10-29
    • 2017-04-18
    • 1970-01-01
    相关资源
    最近更新 更多