خطأ في بناء الجملة عندما أضع كود Python داخل قالب Django

StackOverflow https://stackoverflow.com/questions/276345

سؤال

أحاول القيام بما يلي في قالب Django الخاص بي:

    {% for embed in embeds %}
           {% embed2 = embed.replace("&lt;", "<") %}
           {{embed2}}<br />
    {% endfor %}

ومع ذلك، أحصل دائمًا على كتلة غير صالحة أو خطأ في بناء الجملة عندما أفعل أي شيء من هذا القبيل (وبهذا أعني رمز {% %} داخل الحلقة).لا تحتوي لغة Python على {} للدلالة على "النطاق" لذا أعتقد أن هذه قد تكون مشكلتي؟هل أقوم بتنسيق الكود الخاص بي بشكل خاطئ؟

يحرر:الخطأ الدقيق هو: Invalid block tag: 'embed2'

تحرير 2:نظرًا لأن أحدهم قال إن ما أفعله غير مدعوم في قوالب Django، فقد قمت بإعادة كتابة الكود ووضع المنطق في العرض.انا اعلم هذا:

embed_list = []
for embed in embeds:
    embed_list[len(embed_list):] = [embed.replace("&lt;", "<")] #this is line 35
return render_to_response("scanvideos.html", {
    "embed_list" :embed_list
})

ومع ذلك، يظهر لي الآن خطأ: 'NoneType' object is not callable" on line 35.

هل كانت مفيدة؟

المحلول

وبدلا من استخدام مهمة شريحة في النمو قائمة

وembed_list[len(embed_list):] = [foo]

وربما يجب عليك فقط القيام

وembed_list.append(foo)

ولكن في الحقيقة يجب أن تحاول عدم استبعاد أتش تي أم أل مع وظيفة مكتبة بدلا من فعل ذلك بنفسك.

وهذا يبدو خطأ NoneType مثل embed.replace هو لا شيء على بعض نقطة، والذي يكون له معنى فقط إذا القائمة ليست قائمة سلاسل - قد ترغب في التحقق مرة أنه مع بعض يؤكد أو شيئا من هذا القبيل

نصائح أخرى

وأنا واثق تماما أن قوالب جانغو لا يدعم ذلك. لتحل محل العملية الخاصة بك وأود أن ننظر إلى مرشحات مختلفة.

هل حقا يجب محاولة للحفاظ على أكبر قدر من المنطق كما يمكنك في وجهات نظركم وليس في القوالب.

تم إعاقة لغة قالب Django بشكل متعمد.عندما يستخدمه المصممون غير المبرمجين، يعد هذا أمرًا جيدًا بالتأكيد، ولكن هناك أوقات عندما تستخدمها يحتاج للقيام بالقليل من البرمجة.(لا، ​​لا أريد أن أتجادل حول هذا الأمر.لقد ظهر هذا عدة مرات على مستخدمي Django وDjango-dev.)

طريقتان لإنجاز ما كنت تحاول:

  • استخدم محرك قالب مختلف.يرى جينجا2 للحصول على مثال جيد تم شرحه بالكامل للتكامل مع Django.
  • استخدم علامة القالب التي تسمح لك بعمل تعبيرات بايثون.يرى علامة Expr ليمودو.

لقد استخدمت علامة expr في عدة أماكن وقد أحدثت الحياة كثيراً أسهل.سيستخدم موقع Django الرئيسي التالي jinja2.

وأنا لا أرى لماذا كنت الحصول على "كائن NoneType ليس للاستدعاء". اذا كان ذلك يعني أنه في مكان ما على الخط هو تعبير مثل "فو (...)"، وهذا يعني فو هو لا شيء.

وBTW: أنت تحاول تمديد embed_list، وأنه من الأسهل القيام بذلك من هذا القبيل:

embed_list = []
for embed in embeds:
    embed_list.append(embed.replace("&lt;", "<")) #this is line 35
return render_to_response("scanvideos.html", {"embed_list":embed_list})

وحتى أسهل للاستخدام الفهم القائمة:

embed_list = [embed.replace("&lt;", "<") for embed in embeds]

وقوالب جانغو تستخدم في بناء الجملة الخاصة بهم، وليس مثل كيد أو <ل أ href = "http://en.wikipedia.org/wiki/Genshi_٪28templating_language٪29" يختلط = "نوفولو noreferrer"> Genshi .

لديك للفة الخاصة بك قالب مخصص الوسم .

واعتقد ان السبب الرئيسي التي يفرضها الممارسات الجيدة. في حالتي، لقد سبق صعوبة في شرح هذه القوالب علامات خاصة إلى المصمم على فريقنا. إذا كان عادي بيثون أنا متأكد من أننا لن اختاروا جانغو على الإطلاق. أعتقد أن هناك أيضا مشكلة أداء، بفك قوالب معايير سريعة، في حين كان آخر مرة راجعت genshi أبطأ بكثير. أنا لا أعرف ما اذا كان من المقرر أن جزءا لا يتجزأ من بيثون بحرية، وبالرغم من ذلك.

وتحتاج إما إلى مراجعة نهجكم والكتابة القوالب الخاصة بك حسب الطلب (أكثر أو أقل المرادفات إلى "المساعدين" في روبي على القضبان)، أو محاولة محرك قالب آخر.

لتحرير الخاص بك، وهناك جملة أفضل في بيثون:

embed_list.append(embed.replace("&lt;", "<"))

وأنا لا أعرف إذا كان سوف تصحيح الخطأ، ولكن على الأقل أنها أقل JavaScriptesque؛ -)

وتحرير 2: جانغو يهرب كل المتغيرات تلقائيا. يمكنك فرض HTML الخام مع | مرشح الآمن: {{embed|safe}}

وكنت أفضل أن بعض الوقت في قراءة الوثائق، وهو أمر عظيم حقا ومفيدة.

scroll top