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.
Also, wo ich falsch mache, welche Änderungen sollte ich machen müssen? –
Sorry, ich habe das und danke für die Hilfe. –