У меня есть приложение Django с серверной частью dabatase. Мне нужно отобразить поле множественного выбора HTML с формой ModelForm (поле выбора, позволяющее выбрать несколько элементов).
Данные, используемые для заполнения этого поля множественного выбора, собираются из таблиц / моделей, отличных от той, на которую ссылаютсяв Мета-классе моего ModelForm. Я не знаю, какова была бы лучшая стратегия в этом случае для реализации этой формы «редактирования».
- Значения для заполнения большей части моей формы хранятся в модели «Предметы»
- Значения для заполнения поля множественного выбора - это сохраненные модели 'Item_Usage' и 'Usage'
- Эта форма предназначена для редактирования существующих данных этих 3 моделей / таблиц базы данных
- Элементы могут иметь несколько примененийНапример, «Древесина» может использовать «Печную камеру сгорания» и «Строительство лодок».
Как мне построить поле множественного выбора, чтобы пользователь мог получить текущее «Использование» для элемента и добавить или удалить «Использование» в этой форме, чтобы «Item_usage» (таблица «соединение»)) данные модели обновляются соответственно?
Таблицы базы данных
'items' table (Item model)
+----+-------------------------+-------------+
| id | name | quantity |
+----+-------------------------+-------------+
| 1 | Wood | 20 |
| 2 | Steel | 5 |
| 3 | Asphalt concrete | 80 |
'item_usage' table (Item_table model)
+----+---------+---------------+
| id | item_id | usage_id |
+----+---------+---------------+
| 1 | 1 | 1 |
| 2 | 1 | 2 |
| 3 | 3 | 4 |
'usage' tables (Usage model)
+----+-------------------------+
| id | name |
+----+-------------------------+
| 1 | Boat construction |
| 2 | Stove combustor |
| 3 | House-building |
| 4 | Road building |
models.py
from django.db import models
class Items(models.Model):
name = models.CharField(max_length=30)
quantity = models.IntegerField()
class Meta:
managed = True
db_table = 'items'
class Usage(models.Model):
name = models.CharField(max_length=30)
class Meta:
managed = True
db_table = 'usage'
class Item_usage(models.Model):
item_id = models.IntegerField()
usage_id = models.IntegerField()
class Meta:
managed = True
db_table = 'item_usage'
forms.py
from django.db import models
from .models import Items
from .models import Item_usage
from .models import Usage
from django.core.exceptions import ValidationError
class MyEditForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.label_suffix = ''
self.fields['name'] = forms.CharField(label='Item name',widget=forms.TextInput(attrs={ 'class': 'form-control' }))
self.fields['quantity'] = forms.CharField(label='Item quantity',widget=forms.TextInput(attrs={ 'class': 'form-control' }))
# Multiple choice field here
class Meta(object):
model = Items
fields = ('name','quantity')