1

Ich möchte nur Auswahlfeld in einem Inlineformset filtern.Wie man ModelChoice's Queryset in einem Inlineformset dynamisch filtert?

Szenario:

hat Jede Aufgabe besitzt report.Each Aufgabe eine Buchung .Booking gebucht hat mehrere hat items.I nur bookeditems in Bericht form.Report Form bei der Buchung auf Basis bezogen angezeigt werden soll erzeugt signals und während der Verwendung Bearbeitung Ich verwende inlineformset, um das Formular mit instances zu füllen.

Hier ist mein Code:

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:

Ich möchte in jedem Hortungsfeld für Berichte nur verwandte gebuchte Elemente als Auswahlfeld anzeigen.

Ich versuchte oben Code, aber kein Ergebnis.

Antwort

1

Sie definieren Ihre formset mit dem Namen formset und passen Sie die querysets für Ihre Felder richtig hier:

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

Aber du dann überschreiben, die formset Variable später in Ihrer Sicht die Auswirkungen dieser anfänglichen logischen Entfernung:

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

Also, wo ich falsch mache, welche Änderungen sollte ich machen müssen? –

+1

Sorry, ich habe das und danke für die Hilfe. –

Verwandte Themen