2014-10-13 6 views
0

Я новичок в Django, и я строю работу. Но я не понимаю, как создать форму для получения связанных полей M2M.Django manytomany через форму и вид

Вот мой код:

#views.py 
class JobDetails(generic.DetailView): 

    model = Job 
    template_name = 'companies/job-detail.html' 

    def get_context_data(self, **kwargs): 
     context = super(JobDetails, self).get_context_data(**kwargs) 
     context['company_detail'] = Company.objects.all() 
     return context 

    def apply(request): 
     if request.method == "POST": 
      form = ApplyForm(request.POST) 
      if form.is_valid(): 
       form.save(commit=False) 

       #create job 
       job = Job.objects.all.get(pk=pk) 

       #create candidate 
       candidate = User.objects.all.get(pk=pk) 

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


       form.save() 
       candidatetojob.save() 



       return HttpResponseRedirect('/jobs/') 
     else: 
       form = ApplyForm() 

     return render_to_response(
      "companies/form-candtojob.html", 
      {'form': form} 
     ) 


#forms.py 
class ApplyForm(ModelForm): 

    class Meta: 
     model = CandidateToJob 
     exclude = ['candidate', 'job', 'status'] 


#models.py 
class Job(models.Model): 
    company = models.ForeignKey(Company) 
    candidate = models.ManyToManyField('Candidate', through='CandidateToJob') 
    title = models.CharField(max_length=500) 
    pub_date = models.DateField(auto_now_add=True) 
    ... 

    def __unicode__(self): 
     return self.title 

    def get_absolute_url(self): 
     return reverse('jobdetail', kwargs={'pk': self.pk}) 

class Candidate(models.Model): 
    user = models.OneToOneField(User, primary_key=True) 
    photo = models.ImageField(upload_to='candidateprofile/%Y/%m/%d') 
    ... 

    def __unicode__(self): 
     return self.user.username 


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'), 
     ('3', 'Hired') 
    ) 
    status = models.CharField(max_length=2, choices=STATUS_CHOICES) 

    def __unicode__(self): 
     return self.job.candidate.user.username 

Но в моем template.html, кандидат пользователя является LoggedIn подать заявление на работу (по кнопке отправить форму), я получаю ошибку 405. Мне разрешено выполнять это только в администраторе.

Некоторые мысли о том, что я делаю неправильно? Спасибо заранее.

ответ

0

Вы получаете ошибку 405, потому что у вас нет определенного метода POST. Чтобы принимать запросы POST, вам нужен метод post. У вас есть метод apply, который, по вашему мнению, будет POSTED, но он никогда не будет вызван. Измените применяемый метод:

def post(self, request, *args. **kwargs): 
    form = ApplyForm(request.POST) 

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

     #create job 
     job = Job.objects.all.get(pk=pk) 

     #create candidate 
     candidate = User.objects.all.get(pk=pk) 

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

     form.save() 
     candidatetojob.save() 

     return HttpResponseRedirect('/jobs/') 

    return render_to_response(
     "companies/form-candtojob.html", 
     {'form': form} 
    ) 
+0

Большое спасибо за быстрый ответ. Но теперь я получаю для работы pk «глобальное имя« pk »не определено». Если я попробую job = Job.objects.get(), ошибка будет «get() возвращена более одного задания». Я не знаю, как получить текущую модель pk. Я получаю только текущего пользователя pk. Вы можете мне помочь? Еще раз спасибо. –

+0

Я не уверен, что вы пытаетесь сделать. Ваши комментарии предполагают, что вы пытаетесь создать задание, а затем создаете кандидата, но ничего не создаете. Вы просто извлекаете из БД. И нет никакого ответа на ваш ответ. 'Candidate.objects.get (pk = request.user)' говорит, чтобы получить кандидата с первичным ключом первичного ключа текущего пользователя. Это не имеет смысла, потому что это отдельные модели. – jproffitt

+0

На самом деле это работает, потому что в Кандидатной модели у меня есть: user = models.OneToOneField (User, primary_key = True). Благодарю. –

0

Я получил его работу. Вот как я это сделал. Благодарю.

def post(self, request, *args, **kwargs): 
    form = self.form_class(request.POST) 

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

     #get the job 
     job = self.get_object(queryset=Job.objects.all()) 

     #get the user candidate 
     candidate = Candidate.objects.get(pk=request.user) 

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

     candidatetojob.save() 


     return HttpResponseRedirect('/jobs/') 

    return render(request, self.template_name, {'form': form})