2009-11-11 11 views
10

मान लें कि आपके पास "व्यू स्टोरी" नामक एक दृश्य है जो पाइथन/Django के माध्यम से बैकएंड पर प्रदान किया गया एक वेब पेज है। उस पृष्ठ पर Django के templating सिस्टम (लूप में) का उपयोग कर "देखें स्टोरी" टेम्पलेट के हिस्से के रूप में नीचे दिए गए टिप्पणियों की एक सूची है। यह पृष्ठ आपको सूची में एक टिप्पणी जोड़ने की अनुमति देता है। यह AJAX के माध्यम से किया जाता है और पृष्ठ को नई टिप्पणी के साथ अपडेट किया जाता है (बिना एक नया पूर्ण पृष्ठ अनुरोध भेजने के)।प्रारंभिक रूप से पृष्ठ को प्रस्तुत करें और उसी टेम्पलेट का उपयोग करके AJAX के माध्यम से अपडेट करें HTML

अब, सूची के अंत में नई टिप्पणी जोड़ते समय मैं इस नई टिप्पणी (<li> के अंदर कुछ) के लिए जेनरेट किया गया HTML चाहता हूं जो सटीक उसी कोड का उपयोग करने के लिए उपयोग किया गया था जो मूल टिप्पणियों को उत्पन्न करने के लिए उपयोग किया गया था मूल अनुरोध के माध्यम से ग्राहक।

ऐसा करने के कई तरीके है:

  1. प्रारंभिक प्रतिपादन JavaScript वैरिएबल में टिप्पणी डेटा फेंक है और एक बार पेज प्रदान की गई है जावास्क्रिप्ट के माध्यम से सामग्री जोड़ें। फिर जब नई टिप्पणियां जोड़ दी जाती हैं तो एक ही जावास्क्रिप्ट का उपयोग नए को प्रस्तुत करने के लिए किया जा सकता है। समस्या: एक खोज इंजन परिप्रेक्ष्य से मुझे यकीन नहीं है कि अगर पृष्ठ प्रस्तुत किए जाने के बाद उत्पन्न होता है तो Google टिप्पणियों को अनुक्रमित करने में सक्षम होगा - मुझे अनुमान नहीं है कि

  2. प्रत्येक बार एक नई टिप्पणी जोड़ दी जाती है AJAX के माध्यम से, AJAX अनुरोध ने नई टिप्पणी के JSON डेटा की बजाय पृष्ठ पर डालने के लिए वास्तविक HTML को वापस कर दिया है। HTML को उसी टेम्पलेट स्निपेट का उपयोग करके जेनरेट किया जा सकता है जिसका उपयोग मूल पृष्ठ को प्रस्तुत करने के लिए किया गया था। इसके साथ समस्या यह है कि यह किसी विशेष दृश्य के लिए AJAX अनुरोध या इसे प्रस्तुत करने का एक तरीका है जो मुझे पसंद नहीं है।

  3. # 2 के समान है सिवाय इसके कि एचटीएमएल को नई टिप्पणी के लिए पुनः प्राप्त करने के लिए एक अलग अनुरोध किया गया है या शायद सभी टिप्पणियां और सूची सिर्फ मिटा दी गई है और फिर से प्रस्तुत की गई है। ऐसा न करें क्योंकि यह गहराई से अक्षम और अनावश्यक रूप से समय लेने वाला है।

तो, संक्षेप में प्रस्तुत करने, मैं एक तरह से एक दृश्य के लिए खाका/एचटीएमएल कोड को डुप्लिकेट बचना चाहते हैं। और मुझे कुछ सलाह चाहिए कि दूसरों के लिए क्या काम किया है क्योंकि मुझे पूरा यकीन है कि यह एक आम मामला है जो बैक एंड पर तकनीक के अनियंत्रित है।

धन्यवाद!

उत्तर

3

मुझे लगता है कि विकल्प 2 सबसे अच्छा है। यह वृद्धिशील है (जब कोई टिप्पणी जोड़ दी जाती है तो केवल एक और टिप्पणी प्रस्तुत करती है), और प्रतिपादन का पुन: उपयोग करता है। यदि आप केवल अजाक्स अनुरोध से HTML को वापस नहीं करना चाहते हैं, तो प्रतिक्रिया एक JSON संरचना हो, जिसमें HTML को केवल एक घटक के रूप में शामिल किया गया हो। फिर आप HTML प्राप्त करने के अतिरिक्त अनुरोध के बिना स्थिति (या जो कुछ भी) ले सकते हैं।

विकल्प 1 अपमानजनक है: सर्वर को पृष्ठ प्रस्तुत करना चाहिए क्योंकि इसे पहले दिखाना चाहिए।

विकल्प 3 भी अपर्याप्त है: दो अनुरोध क्यों एक टिप्पणी जोड़ने के लिए करते हैं?

+0

हाँ, मैं सहमत हूं। मैं सिर्फ पूर्णता के लिए संभावनाओं को कवर करना चाहता था। – Karim

6

यहां आपको क्या करना चाहिए:

view_story।एचटीएमएल:

bla bla bla 

Comments: 
<ul id="comments"> 
{% for comment in comments %} 
    <li>{% include "comment_item.html" %}</li> 
{% endfor %} 
</ul> 
<from>Ajax form here</form> 

से आप टिप्पणी (AJAX) जोड़ने के लिए दृश्य बनाने के लिए की जरूरत है:

def add_comment(request): 
    comment = Comment(...) 
    return render_to_response('comment_item.html', {'comment': comment}) 

तो तुम्हारे जाने के बाद देखने add_comment करने के लिए आप टिप्पणी की सामग्री मिल जाएगा अपने ajax प्रश्न दर्ज (एक टिप्पणी) .. उसके बाद बस इसे सूची में धक्का .. fe इस तरह jQuery का उपयोग कर:

$('ul#comments').append('<li>'+comment_content+'</li>') 
+0

तो विकल्प 2. यह सर्वसम्मति प्रतीत होता है (यदि 3 सर्वसम्मति है)। धन्यवाद! – Karim

+0

यह वही है जो मैं करता हूं। सबसे DRY लगता है। – DrBloodmoney

+0

लेकिन यह DRY नहीं है! आप अपना 'टेम्पलेट' कोड दोहरा रहे हैं, जो इस उदाहरण पर वास्तव में सरल है। इसके बाद मैं आपको एक दिन शर्त लगाता हूं कि आप कहेंगे "मैंने अभी अपना दृश्य view_story.html को स्पर्श किया है .... ओह रुको!" – Mauricio

1

वहाँ भी विकल्प 4:

कॉपी सूची में पहले से मौजूद तत्व और उसके मूल्यों को बदल। यह निश्चित रूप से टेम्पलेट्स से कम लचीला है। आप उस मामले को संभालने के बजाय एक छुपा तत्व की प्रतिलिपि बना सकते हैं जहां सूची खाली है।

तुम भी विकल्प 2 बी की कोशिश कर सकते:

विकल्प 2 की तरह सर्वर पर HTML उत्पन्न करें, लेकिन सीधे डेटाबेस तक पहुँचने के बजाय, पीढ़ी दिनचर्या JSON (या किसी वस्तु है कि आसानी से JSON में बदला जा सकता पारित)। इसमें अधिक काम शामिल है, लेकिन इसका मतलब है कि आप एक ही समय में एक एपीआई लिख रहे हैं जब आप अपनी वेबसाइट लिख रहे हैं।

विकल्प 1 कोई भी गैर-वेब एप्लिकेशन उपयोग करेगा। हालांकि खोज इंजन AJAX को संभालने की उनकी क्षमता में सुधार कर रहे हैं, फिर भी एचटीएमएल में सभी सामग्री को वापस करने की दृढ़ता से अनुशंसा की जाती है। मुझे लगता है कि जावास्क्रिप्ट सभी आधुनिक ब्राउज़रों में पर्याप्त तेज़ है कि एसईओ मुद्दे को छोड़कर विशाल पेज 1 को छोड़कर काफी उचित होगा।

विकल्प 5 है - पृष्ठ उत्पन्न करने के लिए सर्वर पर जावास्क्रिप्ट का उपयोग करें और क्लाइंट पर एक ही कोड का उपयोग करें। यह शायद सबसे जटिल दृष्टिकोण है और मैं इसकी अनुशंसा नहीं करता जब तक कि आपके पास वास्तव में कोई अच्छा कारण न हो।

संबंधित मुद्दे

 संबंधित मुद्दे