Django поле множественного выбора

Я пытаюсь отобразить виртуальные машины, у которых есть связанная с ними задача. У меня есть таблица vm, в которой перечислены все виртуальные машины. другая таблица task, в которой перечислены созданные задачи, связанные с виртуальными машинами. и поворотная таблица, которая связывает эти две таблицы. Короче говоря

class VirtualMachine(models.Model):
 //...fields
class VmSchedule(models.Model):
//...fields
vms = models.ManyToManyField(VirtualMachine, blank=True)

Я уже могу отобразить список виртуальных машин и список связанных с ними задач, за исключением того, что отображение происходит в такой форме: список виртуальных машин

Я хотел бы удалить [] и то, что пусто. Я новичок в django и не знаю, как это сделать.

вот код, связанный с этим дисплеем.

<table class="table" id="vm_table">
{% for value, text in form.fields.vms.choices %}
    <tr>
        <td class="clickable_vm">{{ text.0 }}
            <label>
                <input type="checkbox" name="vms" value="{{ value }}" class="displaynone">
                    {{ text.1 }}
            </label>
        </td>
    </tr>
{% endfor %}
class VmGroupModelMultipleChoiceField(ModelMultipleChoiceField):
def label_from_instance(self, obj):
    list_sch = list()
    for j in obj.vmschedule_set.all():
        list_sch.append(j.schedule)
    return [obj.name, list_sch]

и форма моего класса

class VmScheduleForm(forms.ModelForm):
vms = VmGroupModelMultipleChoiceField(widget=forms.CheckboxSelectMultiple(
    attrs={'class': 'displaynone'}),
    queryset=VirtualMachine.objects.exclude(lock=True).order_by(
        'name'),
    required=False,
    label="Choice VMs"
)
//...
class Meta:
    model = VmSchedule
    fields = ('schedule', 'action', 'dow', 'dom', 'mon', 'h', 'm', 'vms')
    widgets = {
        'schedule': forms.TextInput(
            attrs={'class': 'form-control form-form shadow-none '
                            'td-margin-bottom-5 textarea_custom',
                   'placeholder': 'Name'}),
    }

fields = ('schedule', 'action', 'dow', 'dom', 'mon', 'h', 'm', 'vms')

Поскольку эта переменная является строкой списка. Вы можете либо просто использовать простой тег if, чтобы обусловить значение. Например, так:

{% if text.1 != "[]" %}
   {{ text.1 }}
{% endif %}

ИЛИ

Вы можете создать пользовательский тег для фильтрации значений такого типа. Следуйте руководству здесь. Функция и тег будут выглядеть примерно так:

@register.simple_tag
def replace_empty_list_string(value):
    if value == "[]":
         return '' #return what you want an empty list to look like here (e.g. '<empty>')
    return value
{{ text.1|replace_empty_list_string }}

хорошо, я только что использовал ''.join для преобразования списка в строку и он удаляет[].

thx снова я не знал тегов, это очень интересно.

Вернуться на верх