2014-10-28 1 views
0

안녕하세요 저장시 중복 된 개체의 문제에 직면하고 있습니다. 어떻게 방지 할 수 있습니까?저장시 Django def post 복사 방지

미리 감사드립니다.

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

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

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

    class Meta: 
     unique_together = ("candidate", "job") 

여기보기

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

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

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

def post(self, request, *args, **kwargs): 
    form = self.form_class(request.POST) 
    messages.success(request, 'Sucesso!') 

    if form.is_valid(): 
     form.save(commit=False) 
     #create job 
     job = self.get_object(queryset=Job.objects.all()) 
     #create 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/') 

그리고 unique_together에도 불구하고 형태

#forms.py 
class ApplyForm(ModelForm): 

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

이며,이 함수는 항상 복제 객체를 저장합니다.

+0

어떤 종류의 형식보기 대신 DetailView를 사용하고 있습니까? - 예 : UpdateView? –

+0

안녕 다니엘. 나는 특정 작업과 세부 사항을 보여주고 싶다. 이 경우 updateview를 사용하는 것이 더 좋다고 생각하십니까? 내 말은, 비록 내가 updateview를 사용하더라도, post 메소드는 중복 된 엔트리를 유지한다는 것이다. –

답변

1

나는 그것을 작동시켰다. 여기 내 코드는 다음과 같습니다.

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

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

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

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

     messages.error(request, 'You have applied already for this position') 

     return HttpResponseRedirect(reverse('jobdetail', kwargs={'pk': job.pk})) 

    else: 

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

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

      candidatetojob.save() 

      messages.success(request, 'Success! Good luck.') 

    return HttpResponseRedirect('/jobs/') 
+0

이것은 경쟁 조건에서 당신을 구해주지 않습니다. 이것을''atomic()''와 함께 더 잘 포장하십시오. – doniyor