在保存时避免Django def post重复 [英] Avoid Django def post duplicating on save

查看:221
本文介绍了在保存时避免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','未批准'),
('2','Approved'),
('3' 'hired')

status = models.CharField(max_length = 2,choices = STATUS_CHOICES)

class Meta:
unique_together =(候选人工作)

这是视图

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

型=工作
TEMPLATE_NAME = '公司/作业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!')

如果form.is_valid():
form.save(commit = False)
#create job
job = self.get_object(queryset = Job.objects.all())
#create候选人
候选人= Candidate.objects.get(pk = request.user)

#通过表$ s
candidatetojob = CandidateToJob.objects.create(job = job,candidate = candidate)

candidatetojob.save()

return HttpResponseRedirect( / jobs /')

表单

 #forms.py 
class ApplyForm(ModelForm):

class Meta:
model = CandidateToJob
exclude = [ '候选', '工作', '状态']

尽管unique_together,函数总是保存对象复制它们。

解决方案

这是我的代码:

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

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

#create候选人
候选人= Candidate.objects.get(pk = request.user)

#如果对象存在之前保存
如果CandidateToJob.objects.filter(job = job,candidate =候选人).exists():

messages.error(请求,'你已经应用了这个职位')

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

,否则:

如果form.is_valid():
form.save(提交= FALSE)

#assign到通过表
candidatetojob = CandidateToJob.objects.create(job = job,candidate = candidate,status ='0')

candidatetojob.save( )

messages.success(请求,成功!祝你好运。)

返回HttpResponseRedirect( /职位/)


Hi I'm facing issues of duplicated objects when saving. How can I prevent that?

Thanks in advance.

#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")

Here is the view

#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/')

And the form

#forms.py
class ApplyForm(ModelForm):

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

Despite the unique_together, the function always save objects duplicating them.

解决方案

I got it working. Here is my code:

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/')

这篇关于在保存时避免Django def post重复的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆