Как мне изменить форму отправки ManyToMany из «удержания ctrl для выбора нескольких»

#django #forms #many-to-many #user-input

#django #формы #многие ко многим #пользовательский ввод

Вопрос:

Я создаю сайт отслеживания лекарств в Django, и у меня возникают проблемы с назначением лекарств несколько раз. В настоящее время у меня есть модель для лекарства:

 class Medication(models.Model):
UNDEFINED = ''
MILIGRAMS = 'mg'
MILIEQUIVILENT = 'MEQ'
MILILITERS = 'ml'

MEASUREMENT_CHOICES = [
    (UNDEFINED, ' '),
    (MILIGRAMS, 'mg'),
    (MILIEQUIVILENT, 'MEQ'),
    (MILILITERS, 'ml'),
]

ORAL = 'orally'
OPTICALLY = 'optically'
NASALLY = 'nasally'
OTTICALLY = 'per ear'
SUBLINGUAL = 'sublingual'
SUBCUTANEOUS = 'subcutaneous'
PER_RECTUM = 'per rectum'
TOPICAL = 'topical'
INHALATION = 'inhalation'

ROUTE_CHOICES = [
    (ORAL, 'orally'),
    (OPTICALLY, 'optically'),
    (NASALLY, 'nasally'),
    (OTTICALLY, 'per ear'),
    (SUBLINGUAL, 'sublingual'),
    (SUBCUTANEOUS, 'subcutaneous'),
    (PER_RECTUM, 'per rectum'),
    (TOPICAL, 'topical'),
    (INHALATION, 'inhalation'),
]

AS_NEEDED = "PRN"
EVERY = "every"
EVERY_TWO = "every two"
EVERY_THREE = "every three"
EVERY_FOUR = "every four"
EVERY_FIVE = "every five"
EVERY_SIX = "six"
EVERY_SEVEN = "seven"
EVERY_EIGHT = "eight"
EVERY_NINE = "nine"

FREQUENCY_NUM = [
    (AS_NEEDED, "PRN"),
    (EVERY, "every"),
    (EVERY_TWO, "every two"),
    (EVERY_THREE, "every three"),
    (EVERY_FOUR, "every four"),
    (EVERY_FIVE, "every five"),
    (EVERY_SIX, "six"),
    (EVERY_SEVEN, "seven"),
    (EVERY_EIGHT, "eight"),
    (EVERY_NINE, "nine"),
]

MINUTE = 'minute'
HOUR = "hour"
DAY = "day"
WEEK = 'week'
MONTH = "month"

FREQUENCY_MEASUREMENT = [
    (MINUTE, 'minute'),
    (HOUR, "hour"),
    (DAY, "day"),
    (WEEK, 'week'),
    (MONTH, "month"),
]

ONE_TAB = 'tab'
MULTIPLE_TABS = 'tabs'
HALF_TAB = 'half of a tab'
THIRD_TAB = 'third of a tab'
QUARTER_TAB = 'quarter of a tab'
ONE_DROP = 'drop'
MULTIPLE_DROPS = 'drops'

FORM_FACTORS = [
    (ONE_TAB, 'tab'),
    (MULTIPLE_TABS, 'tabs'),
    (HALF_TAB, 'half of a tab'),
    (THIRD_TAB, 'third of a tab'),
    (QUARTER_TAB, 'quarter of a tab'),
    (ONE_DROP, 'drop'),
    (MULTIPLE_DROPS, 'drops')
]

client = models.ForeignKey(
    Client_Medlist,
    blank=True,
    default=None,
    on_delete=models.CASCADE)
name = models.CharField(max_length=255)
drug_class = models.CharField(max_length=255)
dosage = models.FloatField(default=10)
measurement = models.CharField(
    max_length=3,
    choices=MEASUREMENT_CHOICES,
    default=MILIGRAMS,)
number_of_form = models.IntegerField(default=1)
drug_form_factor = models.CharField(
    max_length=255,
    choices=FORM_FACTORS,
    default=ONE_TAB,
)

route = models.CharField(
    max_length=255,
    choices=ROUTE_CHOICES,
    default=ORAL,)
frequency_num = models.CharField(
    max_length=255,
    choices=FREQUENCY_NUM,
    default=EVERY,)
frequency_measurement = models.CharField(
    max_length=255,
    choices=FREQUENCY_MEASUREMENT,
    default=DAY,)

times_taken = models.ManyToManyField(Medication_Times)

start_date = models.DateField(default=timezone.now)
is_med_active = models.BooleanField(default=True)

transcription_author = models.ForeignKey(User, on_delete=models.PROTECT)
transcription_date = models.DateField(default=timezone.now)

def __str__(self):
    return self.name
  

Эта модель имеет отношение «ManyToMany» к модели времени приема лекарств:

 class Medication_Times(models.Model):
times_taken = models.TimeField(default=timezone.now, auto_now=False, auto_now_add=False)

display_name = models.CharField(default='Scheduled Time', max_length=255)

def __str__(self):
return self.times_taken.strftime('%I:%M %p')
  

Для представления, ведущего на эту страницу, я использую LoginRequiredMixin и CreateView:

 class MedicationNew(LoginRequiredMixin, CreateView):
model = Medication
template_name = 'client_profile/new_med.html'
context_object_name = 'posts'
fields = ['client', 'name', 'start_date', 'drug_class', 'dosage', 'measurement', 'route', 'frequency_num', 'frequency_measurement', 'times_taken']

def form_valid(self, form):
    form.instance.author = self.request.user
    return super().form_valid(form)
  

Все это работает хорошо, но там, где максимальное значение между временами составляет пятнадцать минут, когда пользователь создает новое лекарство для добавления в таблицу клиента, время отображается в длинном прокручиваемом списке с помощью только ctrl click для выбора нескольких.

Там, где это должно быть максимально удобным для пользователя, я подумал, что выбор времени, а затем добавление его в поле, отображаемое под выделением прокрутки, может быть лучшим подходом. Таким образом, если пользователь выберет неправильную вещь, она будет в поле для легкого удаления, и ее будет легко прокрутить назад и выбрать правильное время (ы). Затем, после выбора правильного времени (ов), может быть отправлена вся форма.

Есть ли простой способ сделать это в Django? Я повсюду искал способ сделать это, но пока ничего не придумал. Любая помощь была бы очень признательна.