Присоединение 2 списков Django - PullRequest
0 голосов
/ 28 апреля 2019

У меня есть 2 списка ArrayField, и я хочу присоединиться к ним, используя метод zip, чтобы я мог перебирать два списка в Django моих шаблонах django.Но вывод обрабатывает каждый массив как отдельный список.

моя модель

class programas(models.Model):
    title = models.CharField(unique=True, max_length=250)
    script = ArrayField(models.CharField(max_length=8000, blank=True))
    created_on = models.DateTimeField()
    show_date = models.CharField(max_length=300, blank=True, null=True)
    script_eng = ArrayField(models.CharField(max_length=8000, blank=True))
    description = models.CharField(max_length=2000, blank=True, null=True)
    description_eng = models.CharField(max_length=2000, blank=True, null=True)
    url = models.CharField(max_length=200, blank=True, null=True)
    show_id = models.IntegerField(primary_key=True)
    id = models.IntegerField(null=True)

мой взгляд, где я пытаюсь присоединиться к спискам

def pages(request, id):

   obj = programas.objects.get(id=id)
   script = programas.objects.values_list('script')
   script_eng = programas.objects.values_list('script_eng')
   zip_scripts = list(zip(script , script_eng))


   context = {'title': obj.title,
              'show_date': obj.show_date,
              'script' : obj.script,
              'script_eng': obj.script_eng,
              'description': obj.description,
              'description_eng': obj.description_eng,
              'show_id':obj.show_id,
              'url': obj.url,
              'zip_scripts' : zip_scripts,
               }


   return render(request, 'rtves/pages.html', context)

мой код настраница шаблона

  {% if script %}             

            {% for text1, text2 in zip_scripts  %}                  
            <p> {{ text1  }} </p> 
            <p> {{ text2  }} </p>
            {% endfor %}

         {% else %} 
         <p>Nothing here</p>
         {% endif %}

Нужно ли вносить изменения в базу данных?

Ответы [ 2 ]

1 голос
/ 28 апреля 2019

programas.objects.values_list('script') предоставляет список полей сценария из всех объектов программ в базе данных.Итак, у вас фактически есть список списков.

То, что вы, вероятно, хотите, это просто поля из объекта, который у вас уже есть.Поэтому нет необходимости использовать values_list там.

obj = programas.objects.get(id=id)
script = obj.script
script_eng = obj.script_eng

или просто передать их прямо в почтовый индекс (обратите внимание, что list все равно не нужно):

obj = programas.objects.get(id=id)
zip_scripts = zip(obj.script, obj.script_eng)
0 голосов
/ 28 апреля 2019

Причина, по которой это «не работает» в вашей перспективе, заключается в том, что, когда вы приводите наборы запросов к встроенным итерируемым элементам, вы не получаете итерируемое из значений, но итерируемое из одного набора элементов, например

[('bill',), ('while',), ('participant',), ('you',)]

который, когда вы разыгрываете zip и list, становится еще более странным, но вы можете просто польстить этому что-то вроде

list(map(o.itemgetter(0), qs))

В вашем случае весь код будет примерно

flatten = lambda qs: list(map(operator.itemgetter(0), qs))

script = flatten(programas.objects.values_list('script'))
script_eng = flatten(programas.objects.values_list('script_eng'))
# Then you can just zip them together and have what you wanted to begin with
zip_scripts = list(zip(script , script_eng))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...