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 снова я не знал тегов, это очень интересно.