【问题标题】:Django manytomany through create form and viewDjango manytomany 通过创建表单和视图
【发布时间】:2014-12-08 11:47:03
【问题描述】:

我是 Django 的新手,我正在建立一个工作委员会。 但我不明白如何创建一个表单来获取 M2M 的相关字段。

这是我的代码:

#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 中,正在登录的用户候选人申请工作(通过提交表单按钮)我收到 405 错误。我只能在管理员中执行此操作。

关于我做错了什么的一些想法? 提前致谢。

【问题讨论】:

    标签: python django many-to-many has-many-through m2m


    【解决方案1】:

    您收到 405 错误,因为您没有定义任何 POST 方法。要接受 POST 请求,您需要一个 post 方法。你有一个 apply 方法,你认为它会被 POST,但它永远不会被调用。将您的应用方法更改为:

    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}
         )
    

    【讨论】:

    • 非常感谢您的快速响应。但是现在我正在寻找工作 pk“未定义全局名称 'pk'”。如果我尝试 job= Job.objects.get(),错误是“get() 返回了多个 Job”。我不知道如何获得当前模型pk。我只得到当前用户pk。你能帮助我吗?再次感谢。
    • 我不确定你想做什么。您的 cmets 建议您尝试创建工作,然后创建候选人,但您没有创建任何东西。您只是从数据库中检索。而且你的答案也没有办法。 Candidate.objects.get(pk=request.user) 是说用当前用户主键的主键来获取候选人。这没有任何意义,因为它们是独立的模型。
    • 实际上它有效,因为在候选模型中我有:user = models.OneToOneField(User, primary_key=True)。谢谢。
    • 啊,我明白了。对不起,我错过了。
    【解决方案2】:

    我让它工作了。我就是这样做的。谢谢。

    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})
    

    【讨论】:

      猜你喜欢
      • 2016-12-20
      • 2016-07-23
      • 2014-12-28
      • 1970-01-01
      • 1970-01-01
      • 2018-04-05
      • 2011-01-27
      • 1970-01-01
      • 2019-05-21
      相关资源
      最近更新 更多