2009-07-29 16 views
1

Ich versuche ein in Django geschriebenes CMS anzupassen. Die Inhalts-Editoren sind nicht flexibel genug, also versuche ich, eine bessere Lösung zu finden.Schreiben eines Vorlagen-Tags in Django

Ohne zu erklären, ich möchte es ein bisschen wie django-better-chunks oder django-flatblocks. Sie richten eine bearbeitbare Region vollständig innerhalb der Vorlage ein. Ich möchte diese editierbaren Regionen an eine Mischung aus Strings und Objektinstanzen binden. Ein Beispiel wäre mehrere bearbeitbare Bereiche, bezogen auf ein Produkt:

{% block product_instance "title" %} 
{% block product_instance "product description" %} 

Also, wenn Sie eine Ansicht mit einem anderen Produkt als product_instance haben die beiden blocks würden unterschiedliche Daten zeigen. Ich würde auch sehen, dass es für seitenweite Blöcke verwendet wird, die nur den Stringteil durchlaufen. Im Wesentlichen möchte ich 1-Infinity Identifier übergeben können.

Aber ich bin wirklich kämpfen an zwei Fronten hier:

  1. Wie definiere ich die Beziehung zwischen der gemischten Kennung und dem eigentlichen Inhalt „block“ Instanz? Ich habe das Gefühl, dass hier Contenttypes vorkommen könnten, aber ich habe wirklich keine Ahnung, wo ich anfangen soll!

  2. Und wie schreibe ich ein Template-Tag, um die obige Syntax zu lesen und in ein Objekt zum Rendern umzuwandeln?

+1

Will t Sind die editierbaren Regionen manchmal mit Nichtmodellen verbunden? Dies erfordert ein Zwischenmodell, um die gespeicherten Daten für solche Zeichenfolgen in der Datenbank zu speichern. Lass es mich wissen und ich werde ein Beispiel erarbeiten, wenn ich nach Hause komme. Klingt wie eine coole Idee! – Cide

+0

Idealerweise würden Sie eine beliebige Kombination von Objekten und Strings * werfen. Aber ich glaube nicht, dass das für meine Bedürfnisse notwendig ist. Ich werde nur Modellinstanzen und Zeichenketten verwenden. – Oli

+1

Ich habe ein Beispiel in Ihrem verwandten Post ausgepeitscht. Wenn Sie den Ansatz Sound finden, werde ich versuchen, einen guten Weg zu finden, um mit diesem auch umzugehen (da sie beide verwandt sind, ist die Lösung für beide abhängig von den anderen) – Cide

Antwort

2

hierfür können Sie eine Aufnahme-Tag erstellen und verwenden Sie es mögen:

{% load my_tags %} 
{% product bicycle <extra vars ...> %} 

den Tag zu definieren, fügen Sie Ihre app/templatetags/mytags.py:

@register.inclusion_tag('results.html') 
def product(item, *extra): 
    #maybe repackage extra variables 
    #and add them to the returned dictionary 
    item_form = ItemForm(item) #form.ModelForm instance 
    return {'item': item, 'item_form':item_form, ...} 

Dann benötigen Sie eine Vorlage, die HTML für den Artikel zurückgibt: