1

인라인 폼 세트의 선택 필드를 필터링하고 싶습니다.Inlineformset에서 ModelChoice의 쿼리 세트를 동적으로 필터링하는 방법은 무엇입니까?

시나리오 :

모든 작업은 report.Each 작업이 예약 .Booking 여러 items.I이 signals와 동안을 사용하여 생성되는 보고서 form.Report 형태로 예약을 기준으로 만 bookeditems 관련 표시 할 예약 있음 소유하고있다 편집 inlineformset을 사용하여 instances으로 양식을 채 웁니다.

Models.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) 

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

forms.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',] 

report.html :

여기

내 코드입니다
<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> 

각 보고서 보관 필드에 관련 bookeditem을 choicefield로 표시하려고합니다.

위 코드를 시도했지만 결과가 없습니다.

답변

1

당신은 이름 formset와의 formset을 정의하고 사용자 정의하려면 검색어 세트를 당신의 필드에 제대로 여기 :

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

하지만 당신은 그 초기 논리의 영향을 제거,보기에 나중에 formset 변수를 덮어 :

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) 
+0

그래서 내가 잘못하고있는 곳에서 변경해야 할 부분은 무엇입니까? –

+1

죄송합니다. 도와 주셔서 감사합니다. –

관련 문제