代码之家  ›  专栏  ›  技术社区  ›  Emil George James

如何在Inlineformset中动态过滤ModelChoice的查询集?

  •  1
  • Emil George James  · 技术社区  · 8 年前

    我只想过滤inlineformset中的select字段。

    脚本:

    每个任务都有自己的报告。每个任务都有一个预订。预订有几个预订项目。我只想显示相关 bookeditems 基于报告形式的预订。使用生成报表 signals 在编辑时,我使用 inlineformset 填充表单的步骤 instances .

    这是我的代码:

    模型。py公司

    class Task(models.Model):
    
        booking = models.ForeignKey(
            Booking, blank=False, null=True, related_name='booking_id',)
        ......
    
    
    class Report(models.Model):
    
        task = models.ForeignKey(
            Task, blank=True, null=True, related_name='task',)
    
        hoarding = models.OneToOneField(
            BookedItem, blank=True, null=True, related_name='+')
    
        status = models.CharField(
            max_length=32, choices=ReportStatus.CHOICES, blank=True, null=True, default=ReportStatus.INCOMPLETE)
    

    意见。py公司

    def report(request, pk):
        task_instance = get_object_or_404(Task, pk=pk)
        booking = task_instance.booking_id
        #all bookeditems here
        bookeditems = BookedItem.objects.filter(Booking_id=bookeditem)
    
         # inline formsetfactory
        ReportFormset = inlineformset_factory(Task,Report,form=TaskReportForm,fields=('hoarding','status',), extra=0,can_delete=False,)
        data = request.POST or None
        formset = ReportFormset(instance=task_instance)
        for form in formset:
                    form.fields['hoarding'].queryset = bookeditems.all()
    
        if request.method == 'POST':
            formset = ReportFormset(request.POST,instance=task_instance)
            if formset.is_valid():
                formset.save
                return redirect('taskreport')
            else:
                 formset = ReportFormset(instance=task_instance)    
        else:
            formset = ReportFormset(instance=task_instance)
        return render(request, 'report.html', {'formset': formset,
                                                           'bookeditems': bookeditems,
                                                           'task_instance': task_instance})
    

    形式。py公司

    class TaskReportForm(forms.ModelForm):
        def __init__(self, *args, **kwargs):
            super(TaskReportForm, self).__init__(*args, **kwargs)
        class Meta:
            model = PrinterReport
            fields = ['hoarding','status',]
            exclude = ['printer_task',]
    

    <form action="." method="POST">{% csrf_token %}
          {{ formset.management_form }}
    
               <section id="account" class="nice-padding active">
                                  <div class="link-formset">
                                    <table class="listing listing-page">
                                              <thead>
                                                {% for form in formset %}
                                                    {% if forloop.first %}
                                                        {% for field in form %}
                                                            <th>{{ field.label_tag }}</th>
                                                        {% endfor %}
                                                    {% endif %}
                                              </thead>
                                              <tbody>
                                                    <tr>
                                                        {% for field in form %}
                                                            <td>{{ field }}</td>
                                                        {% endfor %}
                                                    </tr>
                                                {% endfor %}
                                              </tbody>
                                          </table>
                                  </div>            
    
                      </section>
    
                       <li class="">
                            <input type="submit" value="Save" class="button">
                        </li>
    
                                </ul>
                            </fieldset>
    </form>
    

    我只想在每个报告囤积字段中将相关bookeditems显示为choicefield。

    我尝试了上述代码,但没有结果。

    1 回复  |  直到 8 年前
        1
  •  1
  •   souldeux    8 年前

    您可以使用名称定义表单集 formset 并在此处正确自定义字段的查询集:

    for form in formset:
        form.fields['hoarding'].queryset = bookeditems.all()
    

    但你会覆盖它 表单集 变量,消除初始逻辑的影响:

    if request.method == 'POST':
            formset = ReportFormset(request.POST,instance=task_instance)
            if formset.is_valid():
                formset.save
                return redirect('taskreport')
            else:
                 #invaild form, re-render with errors - and no custom querysets
                 formset = ReportFormset(instance=task_instance)    
        else:
            #non-POST request, render form - again overwriting custom querysets
            formset = ReportFormset(instance=task_instance)