#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? Я повсюду искал способ сделать это, но пока ничего не придумал. Любая помощь была бы очень признательна.