Почему шаблон Django не распознает список из поля объекта? - PullRequest
0 голосов
/ 25 июня 2019

У меня есть поле объекта, в котором хранится список. Шаблон Django обрабатывает список как строку, он перебирает каждый символ, а не каждое значение списка.

Попытка сохранения поля объекта различными способами, "['1', '2']" и "1,2". Попробовал фильтр "| make_list".

models.py

class SpecialField(models.Model):
    name =  models.CharField(max_length=200,blank=True,null=True)
    description =  models.CharField(max_length=200,blank=True,null=True)
    value_options = models.CharField(max_length=200,blank=True,null=True)
    # value_options might be "['1','2']" or "red, green, blue"

views.py

object_field_list= SpecialField.objects.all()

context = {
    'object_field_list': object_field_list,
}

return render(request, 'app1/template-detail.html', context)

шаблон

{% for object_field in object_field_list%}

    {% for list_value in object_field.value_options %}
       <option>{{ list_value }}</option>
    {% endfor %}

{% endfor %}

Я надеялся на:

<option>1</option>
<option>2</option>

Но я получаю:

<option>[</option>
<option>'</option>
<option>1</option>
<option>'</option>
<option>,</option>
<option>'</option>
<option>2</option>
<option>'</option>
<option>]</option>

Ответы [ 3 ]

0 голосов
/ 25 июня 2019
context = {
    'object_field_list': SpecialField.objects.values_list('value_options', flat=True),
}

Должно дать вам то, что вы на самом деле хотите зациклить.

РЕДАКТИРОВАТЬ: Извините, я упустил тот факт, что вы храните строку вместо использования ArrayField или аналогичного.Проблема из вашего обновленного ответа заключается в том, что ваши данные не соответствуют друг другу.Если бы это были просто все значения, разделенные запятыми, вы могли бы сделать:

object_field_list = [value_list.split(',') for value_list in SpecialField.objects.values_list('value_options', flat=True)]

, но вам потребуется какой-то способ нормализации данных, которые вы храните в value_options.Как данные попадают в базу данных?Если это через Django, вы можете применить какой-либо метод очистки к форме или конечной точке API, который принимает данные.

Попытка сохранения поля объекта различными способами, "['1', '2'] "и" 1,2 ".Попробовал фильтр "| make_list".

Если у вас есть полный контроль над входящими данными, вам лучше было бы нормализовать данные : вместо того, чтобы хранить один value_optionsвведите SpecialField, вы удалите это поле и добавите вторую модель, например, SpecialFieldOption, например

class SpecialFieldOption(models.Model):
    name = models.CharField(max_length=200, blank=False)
    field = models.ForeignKey(SpecialField, related_name='options')

# now you can do

SpecialField.objects.get(pk=1).options.all()

, чтобы просмотреть список всех опций для данного SpecialField.

.
0 голосов
/ 25 июня 2019

Это было самое удобное решение ... определить новый список, используя split. https://stackoverflow.com/a/8318915/9268133. Спасибо всем за помощь!

0 голосов
/ 25 июня 2019

Вы хотите показать данные из модели, поэтому давайте предположим, что у вас есть модель

class SpecialField(models.Model):
    name=models.CharField(max_length=101)
    price = models.IntegerField(default=0)

Учитывая способ, который вы указали в context, вы можете показать это в шаблоне с помощью

{% for obj in object_field_list %}
    {{ obj.name}} - {{ obj.price }}
{% endfor %}

Очевидно, вам нужно внести поправки в вашу модель


Настроить ваше предложение ... ему нужен еще один уровень зацикливания.Все еще не могу заставить его работать.

models.py

class SpecialField(models.Model):
    name=models.CharField(max_length=101)
    price = models.IntegerField(default=0)
    custom_list = models.CharField(max_length=200)

template

{% for obj in object_field_list %}
    {{ obj.name}} - {{ obj.price }}

    {% for list_value in obj.custom_list %}
        {{ list_value }}
        # this is where it's breaking for me
    {% endfor %}

{% endfor %}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...