عرض مجموعة استعلام واحدة في عمودين div (قالب Django)
-
05-07-2019 - |
سؤال
هل هناك طريقة جيدة لتحويل تعداد مجموعة الاستعلام إلى قسمين div
الأعمدة؟
باستخدام 960 شبكة، لقد حصلت على شيء لتأثير...
<div class="container_16">
<div class="grid_8 alpha"></div>
<div class="grid_8 omega"></div>
</div>
في Django، يحتاج أحد النماذج إلى عرض محتوياته في كلا العمودين، ويفضل أن يكون ذلك متساويًا إلى حد ما.في الوقت الحالي، لدي بعض التعليمات البرمجية القبيحة التي تقسم QuerySet في العرض إلى نصفين، ثم يتم عرض كل نصف في العمود الخاص به.
هل يجب أن تكون هناك طريقة أفضل للقيام بذلك، ويفضل استخدام نظام عرض القالب فقط؟
للإشارة فقط، إليك كيفية "عمل" الأمر في الوقت الحالي:
وجهات النظر.py
@render_to('template.html')
def main_athletics_page(request, *args, **kwargs):
sports = Sport.objects.all()
half = sports.count() / 2
return { 'sports_1' : sports[0:half], 'sports_2' : sports[half:] }
template.html
<div class="grid_8 alpha">
{% for sport in sports_1 %}
<!-- Blah blah -->
{% endfor %}
</div>
<div class="grid_8 omega">
{% for sport in sports_2 %}
<!-- Blah blah -->
{% endfor %}
</div>
المحلول
أوصي باستخدام مرشحات جانغو.
توفر مقتطفات جانغو مرشح قالب التقسيم, ، والتي يمكنك استخدامها مثل:
{% load listutil %}
<div class="grid_8 alpha">
{% for sport in sports|partition:"2"|first %}
<!-- Blah Blah -->
{% endfor %}
</div>
<div class="grid_8 omega">
{% for sport in sports|partition:"2"|last %}
<!-- Blah Blah -->
{% endfor %}
</div>
نصائح أخرى
- هذه هي مهمة نظام العرض، وليس العرض.يجب ألا يعرف العرض ما إذا كنت ستعرض عمودين أو 3 أو 4 أعمدة في القالب الخاص بك.
- من الأفضل دائمًا استخدام علامات Django الافتراضية.
استخدم علامة قالب Django الافتراضية cycle
:
<table>
{% for item in items %}
{% cycle 'row' '' as row silent %}
{% if row %}<tr>{% endif %}
<td>
{{ item }}
</td>
{% if not row %}</tr>{% endif %}
{% endfor %}
</table>
سيتم عرض قائمتك [1 2 3 4 5 6] باسم
1 2
3 4
5 6
بالمناسبة، يوجد محرك قالب Jinja2 batch
و slice
المرشحات التي سوف تفعل الخدعة.لقد قمت بالتبديل إلى jinja2 ولم أواجه الآن أيًا من هذه المشكلات المتعلقة بـ "كيفية عرض x باستخدام علامات ومرشحات django السيئة"
أعتقد أنه سيتعين عليك إنشاء علامة القالب الخاصة بك لإجراء تقسيمات على الاستعلامات.سأفعل شيئا مثل.
from django.template import Library, Node, TemplateSyntaxError
from restaurants.forms import MenuItemForm
class Split(Node):
def __init__(self, queryset, split_count=2, basename=None):
self.queryset_name = queryset
self.split_count = split_count
self.basename = basename if basename else queryset
def render(self, context):
qs = context[self.queryset_name]
qs_break = len(qs)/self.split_count
for x in xrange(0, self.split_count-1):
context["%s_%i"%(self.basename, x+1)] = qs[qs_break*x:qs_break*(x+1)]
context["%s_%i"%(self.basename, x+2)] = qs[qs_break*x+1:]
return ''
def split(parser, token):
"""
Call from template will be
{% split <queryset> on <count> as <name> %}
"""
tokens = token.split_contents()
if len(tokens) > 6:
raise TemplateSyntaxError("Too many Tokens")
#Do various tests to make sure it's right.
return Split(tokens[1], tokens[3], tokens[5])
split = register.tag(split)
يرجى ملاحظة أنني لم أختبر هذا الرمز فعليًا، لذلك قد يفشل بشكل مذهل، ولكن يجب أن يوجهك نحو الاتجاه الصحيح لإخراج هذه الأشياء من وجهة نظرك.
إليك حل سريع يستخدم bootstrap ولا يحتاج إلى مرشحات Django
<div class="row">
{% for sport in sports %}
<div class="col-md-6">
<!-- Blah Blah -->
</div>
{% endfor %}
</div>