Как создать форму редактирования ModelForm с полем множественного выбора, заполненным данными из разных моделей в Django? - PullRequest
0 голосов
/ 18 октября 2019

У меня есть приложение Django с серверной частью dabatase. Мне нужно отобразить поле множественного выбора HTML с формой ModelForm (поле выбора, позволяющее выбрать несколько элементов).

Данные, используемые для заполнения этого поля множественного выбора, собираются из таблиц / моделей, отличных от той, на которую ссылаютсяв Мета-классе моего ModelForm. Я не знаю, какова была бы лучшая стратегия в этом случае для реализации этой формы «редактирования».

  1. Значения для заполнения большей части моей формы хранятся в модели «Предметы»
  2. Значения для заполнения поля множественного выбора - это сохраненные модели 'Item_Usage' и 'Usage'
  3. Эта форма предназначена для редактирования существующих данных этих 3 моделей / таблиц базы данных
  4. Элементы могут иметь несколько примененийНапример, «Древесина» может использовать «Печную камеру сгорания» и «Строительство лодок».

Как мне построить поле множественного выбора, чтобы пользователь мог получить текущее «Использование» для элемента и добавить или удалить «Использование» в этой форме, чтобы «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')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...