2017-03-29 3 views
1

Innerhalb einer Tabelle in meiner Vorlage habe ich die folgende, die großen Werke:Passing Daten zurück zu Django Ansicht

<tbody> 
{% for item in items %} 
<tr> 
    <td>{{ item.id }}</td> 
    <td>{{ item.name }}</td> 
    <td>{{ item.status }}</td> 
    <td>{{ item.start_time }}</td> 
    <td>{{ item.end_time }}</td> 
</tr> 
</tbody> 

Ich mag eine Form, die Beiträge die items zu einer Ansicht hinzuzufügen. Ich habe dies versucht:

<form align="center" action="{% url 'app:doit' %}" method="post" ><b></b> 
{% csrf_token %} 
    <input type="hidden" name="items" value="{{ items}}" /> 
    <input type="submit" name="export" value="Export" > 
</form> 

aber das nicht funktioniert, wie ich erwartet hatte, es würde. Die Daten stammen in die Ansicht als eine Folge von Zeichen, so etwas wie diese „...“ Wie gehe ich {{items}} zurück zu einer Ansicht, so kann ich die Einzelteile als Python-Objekte verarbeiten?

Die Exportmethode in meiner Ansicht nach enthält diese:

if 'items' in request.POST: 
    my_items = request.POST['items'] 
+0

Wenn es nur ist das Exportieren und nicht ändern, können Sie verwenden eine Liste von IDs, getrennt durch Kommas. Beachten Sie, dass Benutzer das Feld ändern können, so dass Sie einige [Cryptographic Unterzeichnung] betrachten möchten tun (https://docs.djangoproject.com/en/1.10/topics/signing/), um sicherzustellen, dass das Feld nicht manipuliert wird mit. – user2896976

+0

Ich würde gerne die gesamte Sammlung wie sie ist übergeben. –

+0

Ich bin neugierig, warum Sie das tun müssten. Die Objekte kamen ursprünglich aus dem Backend, warum also wolltest du sie zurückschicken? –

Antwort

0

Sie können nicht POST ein zu einer Ansicht QuerSet zurück. HTML-Formular kann ein Django QuerySet nicht verstehen. Das wäre aber nett!

Was Sie tun können, ist eine custom template tag zu schaffen, die diese erzeugen würde:

<input type="hidden" name="items" value="{% my_items items %}" /> 

dazu:

<input type="hidden" name="items" value="1,2,5,7,8" /> 

wo diese Zahlen sind die id jedes item. Sie können auch das Feld name verwenden, wenn Sie möchten, da es nicht sehr sicher ist, die id s freizulegen.

Dann, wenn POST ed, in der Sicht würde ich tun:

if 'items' in request.POST: 
    # my_item_values is a str 
    my_item_values = request.POST['items'] 
    try: 
     my_item_values = my_item_values.split(',') 
    except TypeError: 
     # Handle error of conversion from string to list here 
    else: 
     # typecast succedded. Get your items! 
     items = Item.objects.filter(id__in=my_item_values) # This is a QuerySet 
     # or this (if you used the names) 
     items = Item.objects.filter(name__in=my_item_values) # This is a QuerySet 

Die individuelle Template-Tag würde wie folgt aussehen:

@register.simple_tag() 
def my_items(items): 
    return ','.join([item.name for item in items]) 
+0

Interessant, ich habe noch nie ein benutzerdefiniertes Vorlagen-Tag implementiert, also vielen Dank für den Link. Danke, ich werde es versuchen. –

+0

Es sollte beachtet werden, dass dieser Ansatz mit einem Template-Tag nur dann bevorzugt wird, wenn Sie dies in verschiedenen Templates tun. Es ist schneller, das Listenverständnis direkt in Ihrer Ansicht zu tun und es in den Kontext zu überführen. – user2896976

+0

Nicht sicher, ich folge dem letzten Kommentar. Die Daten von der Ansicht zur Vorlage funktionieren jetzt großartig. Ich möchte nur in der Lage sein, diese Daten an eine andere Ansicht zu übergeben. Ich werde wahrscheinlich dasselbe von drei verschiedenen Vorlagen tun. –

Verwandte Themen