0

У меня возникла проблема при попытке edit формы в шаблоне с регулярным form и formset, я получаю эту ошибку при попытке сохранить строки обновления. Страница заполняется правильно. Я не уверен, что это за первичная ошибка.Django - объект JobProficienciesFormFormSet не может быть вызван

отслеживающий в 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 

Снова шаблон заполняется правильно. Ошибка заключается в сохранении редактирования. Вот где я застрял. Любая помощь очень ценится. Спасибо!

EDIT Вот как я отображая formset в шаблоне:

   {{ 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 %} 

ответ

1

В этот момент в коде, proficiencies_formset является 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: 

Такого рода вещи является одной из причин, я хотел бы сохранить условность заглавными буквами чтобы начинать имена классов, даже если класс построен на заводе.

+0

Здравствуйте, Питер! Большое вам спасибо, что удалил ошибку, и я вижу вашу точку зрения. Мои соглашения об именах во всем мире, я изучаю Django. :) Я планирую вернуться и реорганизовать имена. – jaredgilmore

+0

При внесении изменений, которые вы указали, это работает. Тем не менее, сейчас я получаю сообщение об ошибке: MultiValueDictKeyError в строке 96: если job.is_valid() и proficiencies_formset.is_valid(): Я совершенно новой для FormSets, так что я предполагаю, что это должен делать с этим? – jaredgilmore

+0

Как вы визуализируете форму в шаблоне? Я не думаю, что когда-либо сталкивался с этой конкретной ошибкой, но у formets есть особые требования к визуализации - это одно место для проверки. Кроме того, я вижу некоторые ссылки на специальные требования для подклассифицированных моделей - является ли «JobProficiencies» подклассом не-абстрактного класса? –

Смежные вопросы