क्या मानक लाइब्रेरी का उपयोग करके Go में नेस्टेड टेम्पलेट रखना संभव है?


87

मुझे कैसे नेस्टेड टेम्प्लेट मिलते हैं जैसे कि जिन्जा के पास अजगर रनटाइम में है। टीबीसी का मेरा मतलब यह है कि मेरे पास बेस टेम्प्लेट से विरासत में आए टेम्प्लेटों का एक समूह है, बस बेस टेम्प्लेट्स के ब्लॉक में दाखिल करना, जैसे कि जिंजा / django- टेम्प्लेट करता है। क्या यह केवल html/templateमानक पुस्तकालय में उपयोग करना संभव है ।

यदि वह संभावना नहीं है, तो मेरे विकल्प क्या हैं। मूंछें एक विकल्प प्रतीत होती हैं, लेकिन क्या तब मैं उन html/templateसंवेदनशील सूक्ष्म विशेषताओं जैसे कि संवेदनशील संवेदनशील पलायन आदि को याद कर रहा हूं ? उपचार के अन्य विकल्प क्या हैं?

(पर्यावरण: Google App Engin, गो रनटाइम v1, देव - मैक OSx शेर)

पढ़ने के लिए धन्यवाद।

जवाबों:


132

हाँ यह संभव है। A html.Templateवास्तव में टेम्पलेट फ़ाइलों का एक सेट है। यदि आप इस सेट में एक परिभाषित ब्लॉक निष्पादित करते हैं, तो इस सेट में परिभाषित अन्य सभी ब्लॉकों तक पहुंच है।

यदि आप अपने दम पर ऐसे टेम्प्लेट सेट का नक्शा बनाते हैं, तो आपके पास मूल रूप से वही लचीलापन है जो जिंजा / जोंगो प्रदान करता है। अंतर केवल इतना है कि html / टेम्पलेट पैकेज का फाइल सिस्टम में कोई सीधा उपयोग नहीं है, इसलिए आपको अपने स्वयं के टेम्प्लेट को पार्स और कम्पोज़ करना होगा।

दो अलग-अलग पृष्ठों ("index.html" और "other.html") के साथ निम्नलिखित उदाहरण पर विचार करें, जो दोनों "base.html" से प्राप्त होते हैं:

// Content of base.html:
{{define "base"}}<html>
  <head>{{template "head" .}}</head>
  <body>{{template "body" .}}</body>
</html>{{end}}

// Content of index.html:
{{define "head"}}<title>index</title>{{end}}
{{define "body"}}index{{end}}

// Content of other.html:
{{define "head"}}<title>other</title>{{end}}
{{define "body"}}other{{end}}

और टेम्पलेट सेट का निम्नलिखित नक्शा:

tmpl := make(map[string]*template.Template)
tmpl["index.html"] = template.Must(template.ParseFiles("index.html", "base.html"))
tmpl["other.html"] = template.Must(template.ParseFiles("other.html", "base.html"))

अब आप कॉल करके अपने "index.html" पेज को प्रस्तुत कर सकते हैं

tmpl["index.html"].Execute("base", data)

और आप कॉल करके अपने "other.html" पृष्ठ को प्रस्तुत कर सकते हैं

tmpl["other.html"].Execute("base", data)

कुछ तरकीबों (जैसे आपकी टेम्प्लेट फ़ाइलों का एक सुसंगत नामकरण सम्मेलन) के साथ, यह tmplस्वतः मानचित्र तैयार करना भी संभव है ।


3
क्या डिफ़ॉल्ट डेटा होना संभव है, उदाहरण के लिए, "हेड" के लिए?
gregghz

18
मैं यहाँ सिर्फ इतना जोड़ता हूँ कि वास्तविक टेम्प्लेट को प्रस्तुत करने के लिए मुझे कॉल करना था tmpl["index.html"].ExecuteTemplate(w, "base", data)
३३

base.html दो बार पार्स और संग्रहीत किया जाता है। आप golang.org/pkg/text/template/#example_Template_share के
Maarten O.

3
जब मुझे नेस्टेड टेम्प्लेट में डेटा पास करने में समस्या हो रही है। {{ .SomeData }}आंतरिक टेम्पलेट में डेटा प्रदर्शित नहीं किया जाएगा। बाहरी काम करता है।
0xAffe

यह मायने रखता है, तो template.ParseFiles("index.html", "base.html")है template.ParseFiles("base.html", "index.html")?
शामक

10

ध्यान दें, जब आप अपने बेस टेम्प्लेट को निष्पादित करते हैं, तो आपको चाइल्ड टेम्प्लेट के नीचे मानों को पास करना होगा, यहां मैं बस "पास" कर दूंगा, ताकि सबकुछ पास हो जाए।

टेम्पलेट एक {{}}} प्रदर्शित करता है

{{define "base"}}
<html>
        <div class="container">
            {{.}}
            {{template "content" .}}
        </div>
    </body>
</html>
{{end}}

टेम्पलेट दो प्रदर्शित करता है {{.domains}} जो कि जनक में पारित हो गया है।

{{define "content"}}
{{.domains}}
{{end}}

ध्यान दें, यदि हमने {{टेम्पलेट "सामग्री" के बजाय {{टेम्पलेट "सामग्री"।} का उपयोग किया है, तो .domains सामग्री टेम्पलेट से सुलभ नहीं होंगे।

DomainsData := make(map[string]interface{})
    DomainsData["domains"] = domains.Domains
    if err := groupsTemplate.ExecuteTemplate(w, "base", DomainsData); err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
    }

5
मॉडल के नीचे से गुजरना एक विवरण है जिस पर मैं अटक गया था। ;) धन्यवाद
पैट्रिक

1
मुझे भी - यह पता लगाने के लिए थोड़ा सा लग गया :)
रोबर्ट राजा

1
क्या! मैं विश्वास नहीं कर सकता कि {{टेम्पलेट}} प्लेसहोल्डर के अंत में छोटी छोटी बिंदी में बहुत अधिक अर्थ था! क्यों पृथ्वी पर ट्यूटोरियल, या यहाँ तक कि आधिकारिक गो प्रलेखन का कहीं भी उल्लेख नहीं किया गया है ?? मैं भड़क गया हूँ ... लेकिन आपका जवाब पाकर बहुत खुश हूँ! बहुत बहुत धन्यवाद, अब घोंसले के कई स्तरों के साथ मेरे टेम्पलेट खूबसूरती से काम करते हैं!
ग्वेनेथ लेलेवेन

वास्तव में, एक ही बात मैं पता लगाने की कोशिश कर रहा था!
देवफू

5

अन्य टेम्पलेट पैकेज के साथ काम करने के बाद, अब एक दिन मैं ज्यादातर मानक html / टेम्पलेट पैकेज के साथ काम करता हूं, मुझे लगता है कि मैं सरलता प्रदान करने और अन्य उपहारों की सराहना नहीं करने के लिए अनुभवहीन था। मैं निम्नलिखित परिवर्तनों के साथ स्वीकृत उत्तर के लिए एक समान दृष्टिकोण का उपयोग करता हूं

आपको अतिरिक्त लेआउट के साथ अपने लेआउट्स को लपेटने की आवश्यकता नहीं है base, प्रत्येक पार्स की गई फ़ाइल के लिए एक टेम्प्लेट ब्लॉक बनाया जाता है, इसलिए इस मामले में यह बेमानी है, मैं जाने के नए संस्करण में प्रदान की गई ब्लॉक एक्शन का उपयोग करना पसंद करता हूं, जो आपको अनुमति देता है यदि आप चाइल्ड टेम्प्लेट में एक प्रदान नहीं करते हैं तो डिफ़ॉल्ट ब्लॉक सामग्री

// base.html
<head>{{block "head" .}} Default Title {{end}}</head>
<body>{{block "body" .}} default body {{end}}</body>

और आप पेज टेम्प्लेट के समान हो सकते हैं

// Content of index.html:
{{define "head"}}<title>index</title>{{end}}
{{define "body"}}index{{end}}

// Content of other.html:
{{define "head"}}<title>other</title>{{end}}
{{define "body"}}other{{end}}

अब टेम्पलेट को निष्पादित करने के लिए आपको इसे कॉल करने की आवश्यकता है

tmpl["index.html"].ExecuteTemplate(os.Stdout, "base.html", data)

4

पोंगो का प्रयोग करें , जो गो टेम्प्लेट का एक सुपर-सेट है जो Django की तरह टेम्पलेट विरासत के लिए {{एक्सटेंड}}} और {{ब्लॉक}} टैग का समर्थन करता है।


4

मैं दिनों के लिए इस जवाब पर वापस आ रहा हूं, अंत में बुलेट को थोड़ा सा और इसके लिए एक छोटा अमूर्त परत / पूर्व प्रोसेसर लिखा है। यह मूल रूप से:

  • टेम्प्लेट में 'एक्सटेंड्स' कीवर्ड जोड़ता है।
  • ओवरराइडिंग को 'डिफाइन' कॉल की अनुमति देता है (इस प्रकार ग्रेगरी के लिए डिफ़ॉल्ट मान संभव है)
  • गैर परिभाषित 'टेम्पलेट' कॉल की अनुमति देता है, वे सिर्फ एक खाली स्ट्रिंग देते हैं
  • का डिफ़ॉल्ट मान सेट करता है। 'टेम्पलेट' में कॉल करता है। माता पिता की

https://github.com/daemonl/go_sweetpl

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.