2017-10-31 2 views
0

ich das Folgemodell haben:Django Vorlagen iterieren Modellfelder mit Indizes

class UserProfile(...): 
    ... 
    photo1 = models.URLField() 
    photo2 = models.URLField() 
    photo3 = models.URLField() 
    photo4 = models.URLField() 
    photo5 = models.URLField() 

Und in der Create/Update-Vorlage, ich habe fünf Kopien der folgenden div für file1-file5 schreiben:

<div> 
    Photo 1: 
    {% if userProfileForm.instance.file1 %} 
    <a href="{{ userProfileForm.instance.file1 }}" target=_blank>View</a> 
    {% endif %} 
    <input type=file name=file1> 
    {% if userProfileForm.instance.file1 %} 
    <a href="{% url 'account:deletePhoto' userProfileForm.instance.id %}">Delete</a> 
    {% endif %} 
</div> 

Gibt es eine Möglichkeit, Feld file<i> zu iterieren?

{% for i in '12345' %} 
    <div> 
    Photo {{ forloop.counter }}: 

    ... 

    </div> 
{% endfor %} 
+2

sein kann jemand helfen Sie erstellen eine Krücke, um Ihr Problem zu lösen, aber IMHO beste Möglichkeit ist, verwandte Modell mit 'Foto' und' Sequenz' Felder zu erstellen –

Antwort

1

in django haben Sie _meta API. Also ich denke, das löst Ihr Problem, wenn Sie die get_fields-Methode verwenden (und vielleicht werden Sie die gewünschten Felder herausfiltern).

hoffe es hilft.

Update mit Beispiel

lassen Sie mich zeigen, wie Sie Ihr Problem lösen sollte:

desired_fields = [] 
for field in UserProfile._meta.get_fields() 
    if "photo" in field.name: 
    desired_fields.append(field.name) 
context.update(fields=desired_fields) # pass it in the context 

an dieser Stelle Sie Ihre gewünschten Felder haben, die mit in der Vorlage für Schleife verwendet werden soll. Und noch etwas, müssten Sie einige Template-Tag hinzuzufügen realen Feld von String-Darstellung zu erhalten:

# custom template tag 
def from_string_to_field(instance, field_str): 
    return getattr(instance, field_str, None) 

und in der Template-Code aussehen wird dieses

{% for field in fields %} 
    {{userProfileForm.instance|from_string_to_field:"field"}} 
{% endfor %} 
+0

Aber wie bekomme ich das Feld in der Vorlage? '{{userProfileForm.instance.get_fields}}' funktioniert nicht. –

+1

Bitte sehen Sie die aktualisierte Antwort, hoffe es gibt Ihnen mehr Details und vollständigen Pfad, wie Sie _meta API verwenden sollten. –