Hinweis: Ich bin neu bei Django und Python. Ich bin mir nicht sicher, ob ich die Verwendung von Inline-Formsets in irgendeiner Weise missverstanden habe.Django - Finden Sie heraus, welche Modellinstanz ich in einem Inline-Formset bearbeite
Ich musste in der Lage sein, bestimmte Felder für mehrere Instanzen eines Guest-Modells (verbunden mit einem übergeordneten Invite-Modell) gleichzeitig in einem Formular zu bearbeiten. Nach langem Hin und Her habe ich ein Inline-Formularset eingerichtet, das erfolgreich übermittelt wird.
Die Benutzeroberfläche ist jedoch verwirrend, weil Sie nicht wissen, für welchen Gast Sie Details eingeben. Jeder Gast hat ein Feld guest_name
, und ich möchte nur diesen Namen für jedes Formular anzeigen, damit Benutzer wissen, für wen sie bearbeiten.
Hier ist meine (verkürzt) Ansicht:
def extra_view(request, code):
# Get the specific invite
invite = get_invite(code)
# Get the context from the request.
context = RequestContext(request)
# Store guests attending object
guests_attending = invite.guest_set.filter(attending=True, invite=invite)
# Create the formset for each Guest
GuestFormset = inlineformset_factory(Invite, Guest,
form=ExtraForm,
fields=('diet', 'transport'),
extra=0,
can_delete=False)
if request.method == "POST":
formset = GuestFormset(request.POST, request.FILES,
instance=invite,
queryset=Guest.objects.filter(attending=1))
if formset.is_valid():
# Save the data to the database.
formset.save()
# Redirect stuff here
if guests_attending.count() > 0:
formset = GuestFormset(instance=invite, queryset=Guest.objects.filter(attending=1))
# Return the view
return render_to_response('app/extra.html', {
'GuestForm': formset,
'invite': invite,
'guests_attending': guests_attending,
'errors': formset.errors
}, context)
else:
# Backup for if no guests are attending
Hier ist, wie die Modelle aussehen:
class Invite(models.Model):
# Code to identify invites by
code = models.CharField(max_length=6, default=code_generator(4, do_check=True), unique=True)
group_name = models.CharField(max_length=200)
def __str__(self):
return self.group_name
class Guest(models.Model):
invite = models.ForeignKey(Invite, on_delete=models.CASCADE)
guest_name = models.CharField(max_length=200)
diet = models.CharField(max_length=250, null=True, blank=True)
transport = models.NullBooleanField(default=False)
attending = models.NullBooleanField(default=False)
def __str__(self):
return self.guest_name
Und hier ist meine Vorlage
{% if invite %}
<form method="post" action="">
{% csrf_token %}
{{ GuestForm.management_form }}
<table>
{% for form in GuestForm %}
<!-- Which guest am I editing for?! -->
{% for hidden in form.hidden_fields %}
{{ hidden }}
{% endfor %}
{% for field in form.visible_fields %}
{{ field.errors }}
<div>
{{ field.help_text }}
{{ field }}
</div>
{% endfor %}
{% endfor %}
</table>
<button type="submit" class="btn">Continue</button>
</form>
{% endif %}
Beachten Sie, dass, wenn 'request.method ==„POST“' aber die Form ist ungültig, werden Sie dann das Formset mit einem frischen formset ersetzen. Das bedeutet, dass Ihre Benutzer die Fehler nicht sehen werden. – Alasdair