سؤال

أريد تعديل النتائج من استعلام flask-sqlalchemy قبل إرسالها إلى render_template().

يقوم العرض بالاستعلام عن العناصر وتعديلها:

items = Items.query

for i in items: 
    date = i.__dict__['date']
    i.__dict__['date_modified'] = date.replace('/', '-')

return render_template('index.html', items=items)

عندما يقوم القالب بإخراج العناصر:

{% for i in items %}{{i.date_modified}}{% endfor %} 

يظهر هذا الخطأ في مصحح الأخطاء:

KeyError: 'date_modified'

ومع ذلك، إذا قمت بتعديل الاستعلام الأولي للحصول على كائن ترقيم الصفحات، فلن يظهر الخطأ وسيظهر تاريخ التعديل.

items = Items.query
items = items.paginate(page_num, items_per_page, True).items 

for i in items: 
    date = i.__dict__['date']
    i.__dict__['date_modified'] = date.replace('/', '-')

return render_template('index.html', items=items)

ما الفرق بين نتيجة الاستعلام ونتيجة ترقيم الصفحات الذي يسمح بالتلاعب بالأخيرة في مكانها ولكن ليس بالأولى؟كيف يمكنني تعديل النتائج دون تعديل الاستعلام باستخدام ترقيم الصفحات؟

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

المحلول

في كلا المثالين تمر items إلى القالب.ومع ذلك، items القيمة مختلفة في كل حالة.

في المثال الأول، items هو كائن الاستعلام من Items.query.يمكن تكرار هذه القيمة، وهذا هو سبب عمل حلقة for.ولكن يجب تخزين العناصر في مكان دائم.في القالب، يتم تكرار الاستعلام مرة أخرى، ويتم إرجاع مثيلات العناصر الجديدة التي لم يتم تعديلها في طريقة العرض.

وفي المثال الثاني items إنه نتيجة ل paginate, ، قائمة Items.عندما تقوم بتعديل كل عنصر، فإنه يظل مخزّنًا في القائمة، ويؤدي تكراره مرة أخرى في القالب إلى ظهور نفس العناصر.

لحل الخطأ من المثال الأول، تحتاج إلى تخزين المراجع إلى العناصر التي يتم إرجاعها.أسهل طريقة للقيام بذلك هي إجبار الاستعلام على إرجاع قائمة: items = Items.query.all().

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top