2015-04-02 1 views
2

Salut tout le monde je suis confronté à des problèmes avec créer un M2M à travers.Django 'ModelForm' objet n'a aucun attribut 'nettoyé_data' pour M2M à

Avec le code ci-dessous, je reçois le message: objet 'SendCandForm' n'a pas d'attribut 'cleaned_data'

Si je change

#forms.py 
cojobs=Company.objects.select_related('job').values_list('job__title', flat=True) 

Pour

#forms.py 
cojobs=Company.objects.select_related('job__id').values_list('job__id', flat=True) 

Et

#views.py 
job = form.cleaned_data['job'] 
status = form.cleaned_data['status'] 

Pour

#views.py 
job = form.data.get('job') 
status = form.data.get('status') 

Quand il existe des données(), tout va bien. Mais quand il essaye de faire le poteau, j'obtiens l'erreur:

Cannot assign "u'2'": "CandidateToJob.job" must be a "Job" instance. 

J'espère que vous pouvez m'aider.

Voici mon code

#models.py 
class Company(models.Model): 
    user = models.OneToOneField(User, primary_key=True) 
    name = models.CharField(max_length=50) 
    ... 

class Job(models.Model): 
    company = models.ForeignKey(Company) 
    candidate = models.ManyToManyField('Candidate', through='CandidateToJob') 
    title = models.CharField(max_length=500) 
    ... 

class Candidate(models.Model): 
    user = models.OneToOneField(User, primary_key=True) 
    ... 

class CandidateToJob(models.Model): 
    job = models.ForeignKey(Job, related_name='applied_to') 
    candidate = models.ForeignKey(Candidate, related_name='from_user') 
    STATUS_CHOICES = (
     ('0', 'New'), 
     ('1', 'Not approved'), 
     ('2', 'Approved') 
    ) 
    status = models.CharField(max_length=2, choices=STATUS_CHOICES) 

La forme

#forms.py 
class SendCandForm(ModelForm): 

    cojobs=Company.objects.select_related('job').values_list('job__title', flat=True) 
    cojobs_choices = [('', 'Choose')] + [(id, id) for id in cojobs] 

    job = forms.ChoiceField(choices=cojobs_choices ,label="Vaga", required=True, widget=forms.Select(attrs={'class': 'form-control'})) 

    STATUS_CHOICES = (
     ('0', 'New'), 
     ('1', 'Not approved'), 
     ('2', 'Approved') 
    ) 
    status = forms.ChoiceField(required=True, widget=forms.RadioSelect(attrs={'class': ''}), choices=STATUS_CHOICES) 

    class Meta: 
    model = CandidateToJob 
     exclude = ['candidate'] 

Voici mon avis

#views.py 
class MyCandidateDetail(SuccessMessageMixin, UpdateView): 

    model = Candidate 
    template_name = 'dashboard/my-candidate-detail.html' 
    form_class = SendCandForm 

    def get_context_data(self, **kwargs): 
     context = super(MyCandidateDetail, self).get_context_data(**kwargs) 
     return context 

    def get_initial(self, *args, **kwargs): 
     candidate = self.get_object() 
     self.initial = {'candidate': candidate} 
     return self.initial 

    def get_form_kwargs(self, *args, **kwargs): 
     kwargs = {'initial': self.get_initial()} 
     return kwargs 

    def post(self, request, *args, **kwargs): 

     form = self.form_class(request.POST) 

     #get job and status from form 
     job = form.cleaned_data['job'] 
     status = form.cleaned_data['status'] 

     #get candidate 
     candidate = self.get_object() 

     #check if objects exists before save 
     if CandidateToJob.objects.filter(job = job, candidate = candidate).exists(): 

      messages.error(request, 'Error!') 

      return HttpResponseRedirect(reverse('mycandidatedetail', kwargs={'pk': candidate.pk})) 

     else: 

      if form.is_valid(): 
       form.save(commit=False) 

       #assign to the through table 
       candidatetojob = CandidateToJob.objects.create(job=job, candidate=candidate, status=status) 

       candidatetojob.save() 

       messages.success(request, 'Success!') 

      return HttpResponseRedirect(reverse('mycandidatedetail', kwargs={'pk': candidate.pk})) 

Répondre

1

SOLVED

je devais changer ma forme de ModelForm à des formes. Formulaire

Voici le code:

#forms.py 
class SendCandForm(forms.Form): 

    job = Company.objects.select_related('job').values_list('job__title', flat=True) 
    jobs_choices = [('', 'Escolher')] + [(id, id) for id in job] 

    job = forms.ChoiceField(choices=jobs_choices, label="Vaga", required=True, widget=forms.Select(attrs={'class': 'form-control'})) 

    STATUS_CHOICES = (
     ('0', 'Novo'), 
     ('1', 'Não aprovado'), 
     ('2', 'Pré Selecionado'), 
     ('3', 'Contratado') 
    ) 
    status = forms.ChoiceField(required=True, widget=forms.RadioSelect(attrs={'class': ''}), choices=STATUS_CHOICES) 

    def save(): 
     job = self.cleaned_data['job'] 
     status = self.cleaned_data['status'] 
     ctj = CandidateToJob(
      job = job, 
      status = status, 
      candidate = candidate, 
     ) 
     ctj.save() 

     return ctj 

Et la fonction de poste UpdateView

#views.py 
def post(self, request, *args, **kwargs): 

    form = self.form_class(request.POST) 

    if form.is_valid(): 

     joblist = form.cleaned_data['job'] 
     job = Job.objects.get(title=joblist) 
     status = form.cleaned_data['status'] 
     candidate=self.get_object() 

     if CandidateToJob.objects.filter(job=job, candidate=candidate).exists(): 
      messages.error(request, 'Ops, este candidato já está na vaga selecionada') 
      return HttpResponseRedirect(reverse('mycandidatedetail', kwargs={'pk': candidate.pk})) 

     else: 
      candidatetojob = CandidateToJob.objects.create(job=job, candidate=candidate, status=status) 
      candidatetojob.save() 
      messages.success(request, 'Sucesso! Candidato inserido na Vaga.') 

     return HttpResponseRedirect(reverse('mycandidatedetail', kwargs={'pk': candidate.pk})) 
0

Résolu question cleaned_data.

Nécessaire pour changer views.py def post comme ci-dessous le code. Mais encore obtenir l'erreur

Cannot assign "u'2'": "CandidateToJob.job" must be a "Job" instance. 

ou

Cannot assign "u'title'": "CandidateToJob.job" must be a "Job" instance. 

Nouveau post def dans views.py

def post(self, request, *args, **kwargs): 

    form = self.form_class(request.POST) 

    if form.is_valid(): 

     #get job and status from form 
     job = Job.objects.get(id=form.cleaned_data['job']) 
     status = form.cleaned_data['status'] 

     #get candidate 
     candidate = self.get_object() 

     #check if objects exists before save 
     if CandidateToJob.objects.filter(job = job, candidate = candidate).exists(): 

      messages.error(request, 'Ops, este candidato já está na vaga selecionada') 

      return HttpResponseRedirect(reverse('mycandidatedetail', kwargs={'pk': candidate.pk})) 

     else: 
      form.save(commit=False) 

      #assign to the through table 
      candidatetojob = CandidateToJob.objects.create(job=job, candidate=candidate, status=status) 

      candidatetojob.save() 

      messages.success(request, 'Sucesso! Candidato inserido na Vaga.') 

     return HttpResponseRedirect(reverse('mycandidatedetail', kwargs={'pk': candidate.pk}))