2016-05-09 10 views
1

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 %} 
+0

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

Antwort

1

Sie die Instanz des Formulars zugreifen können mit form.instance . In der Vorlage könnte man so etwas tun:

{{ form.instance.guest_name }} 
+0

Ha, du hast es so leicht gemacht, nicht sicher, wie ich es verpasst habe. Vielen Dank. –