Django форма с несколькими входами из цикла сохраняет только последнюю запись в базу данных
У меня проблема с сохранением данных из формы в django. Сохраняется только последняя запись. Я формирую список дат (дни месяца) в представлении и отображаю его в форме в шаблонах вместе с полями рядом с типом. В шаблонах все отображается правильно, но когда я отправляю на, в представлении для сохранения появляется только последняя запись из формы. Что я делаю не так, кто-нибудь может помочь?
forms.py
class DoctorsSchedule(forms.ModelForm):
# work_hours = models.CharField(max_length=50, blank=True, null=True, default='8:00-21:00')
# official_hours = models.CharField(max_length=50, blank=True, null=True, default='8:00-19:00')
class Meta:
model = DoctorSchedule
fields = ['date', 'day_type', 'work_hours', 'scheme', 'official_hours']
model.py
class DoctorSchedule(models.Model):
id = models.AutoField(primary_key=True, unique=True)
date = models.DateField(blank=True, null=True)
day_type = models.CharField(max_length=255, blank=True, null=True, default='Pracujący')
work_hours = models.CharField(max_length=50, blank=True, null=True, default='8:00-21:00')
scheme = models.CharField(max_length=255, blank=True, null=True, default='20')
official_hours = models.CharField(max_length=50, blank=True, null=True, default='8:00-19:00')
def __str__(self):
return self.date
view.py
def terminarz(request):
today = datetime.now()
now = date.today()
locale.setlocale(locale.LC_TIME, 'pl_PL')
def months():
months = {'1': 'Styczeń', '2': 'Luty', '3': 'Marzec', '4': 'Kwiecień', '5': 'Maj', '6': 'Czerwiec',
'7': 'Lipiec',
'8': 'Sierpień', '9': 'Wrzesień', '10': 'Październik', '11': 'Listopad', '12': 'Grudzień'}
return months
##################### days of month list ######################################
def days_of_month_list():
if request.GET.get('year') and request.GET.get('month'):
y = int(request.GET.get('year'))
m = int(request.GET.get('month'))
btn_y = int(request.GET.get('year'))
else:
y = today.year
m = today.month
btn_y = today.year
date_list = {}
for d in range(1, monthrange(y, m)[1] + 1):
x = '{:04d}-{:02d}-{:02d}'.format(y, m, d)
dayName = datetime.strptime(x, '%Y-%m-%d').weekday()
date_list[x] = calendar.day_name[dayName].capitalize()
################### end days of month list #################################
return date_list
months = months()
date_list = days_of_month_list()
btn_today = today.year
btn_today_1 = today.year + 1
btn_today_2 = today.year + 2
if request.GET.get('year') and request.GET.get('month'):
btn_y = int(request.GET.get('year'))
else:
btn_y = today.year
if request.method == 'POST':
form = DoctorsSchedule(request.POST)
if form.is_valid():
form.save()
else:
print(form.is_valid()) # form contains data and errors
print(form.errors)
form = DoctorsSchedule()
else:
form = DoctorsSchedule
context = {
'today': today,
'now': now,
'months': months,
'date_list': date_list,
'btn_today': btn_today,
'btn_today_1': btn_today_1,
'btn_today_2': btn_today_2
}
return render(request, "vita/panel/terminarz.html", context)
templates.html
Похоже, вы не передаете форму в контекст шаблона
context = {
'today': today,
'now': now,
'months': months,
'date_list': date_list,
'btn_today': btn_today,
'btn_today_1': btn_today_1,
'btn_today_2': btn_today_2
}
попытайтесь добавить 'form': form,
к контексту
context = {
'form': form,
'today': today,
'now': now,
'months': months,
'date_list': date_list,
'btn_today': btn_today,
'btn_today_1': btn_today_1,
'btn_today_2': btn_today_2
}
``` try to add `'form': form, ` to the context it may solve the issue
Обновление:
Я печатаю(request.POST) и вот результат. Когда я использую form.is_valid, он не показывает ошибок и form.save() сохраняет только последнюю запись из QueryDict
<QueryDict: {'csrfmiddlewaretoken': ['mzIuVQEY1a6s15UEInWD5xZOm6HapMyOAikLItkMTvIGOizxIU9NErfh4SUkfiR9'], 'data': ['2022-12-01', '2022-12-02', '2022-12-03', '2022-12-04', '2022-12-05', '2022-12-06', '2022-12-07', '2022-12-08', '2022
-12-09', '2022-12-10', '2022-12-11', '2022-12-12', '2022-12-13', '2022-12-14', '2022-12-15', '2022-12-16', '2022-12-17', '2022-12-18', '2022-12-19', '2022-12-20', '2022-12-21', '2022-12-22', '2022-12-23', '2022-12-24', '2022-12-25',
'2022-12-26', '2022-12-27', '2022-12-28', '2022-12-29', '2022-12-30', '2022-12-31'], 'day_type': ['Pracujący', 'Pracujący', 'Wolny', 'Wolny', 'Pracujący', 'Pracujący', 'Pracujący', 'Pracujący', 'Pracujący', 'Wolny', 'Wolny', 'Pracu
jący', 'Pracujący', 'Pracujący', 'Pracujący', 'Pracujący', 'Wolny', 'Wolny', 'Pracujący', 'Pracujący', 'Pracujący', 'Pracujący', 'Pracujący', 'Wolny', 'Wolny', 'Pracujący', 'Pracujący', 'Pracujący', 'Pracujący', 'Pracujący', 'Wolny'
], 'official_hours_start': ['08:00-19:00', '08:00-19:00', '08:00-19:00', '08:00-19:00', '08:00-19:00', '08:00-19:00', '08:00-19:00', '08:00-19:00', '08:00-19:00', '08:00-19:00', '08:00-19:00', '08:00-19:00', '08:00-19:00', '08:00-19
:00', '08:00-19:00', '08:00-19:00', '08:00-19:00', '08:00-19:00', '08:00-19:00', '08:00-19:00', '08:00-19:00', '08:00-19:00'], 'work_hours_start': ['08:00-21:00', '08:00-21:00', '08:00-21:00', '08:00-21:00', '08:00-21:00', '08:00-21
:00', '08:00-21:00', '08:00-21:00', '08:00-21:00', '08:00-21:00', '08:00-21:00', '08:00-21:00', '08:00-21:00', '08:00-21:00', '08:00-21:00', '08:00-21:00', '08:00-21:00', '08:00-21:00', '08:00-21:00', '08:00-21:00', '08:00-21:00', '08:00-21:00'], 'scheme': ['30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30'], 'update_schedule': ['Uaktualnij terminarz']}>
Это решило мою проблему
if request.method == "POST":
if form.is_valid():
x1 = request.POST #get data from request and getlist from QueryDict
data_l = x1.getlist('data')
day_type_l = x1.getlist('day_type')
work_hours_l = x1.getlist('work_hours_start')
scheme_l = x1.getlist('scheme')
official_hours_l = x1.getlist('official_hours_start')
for date, day_type, work_hours, official_hours, scheme in zip(data_l,day_type_l,work_hours_l,official_hours_l,scheme_l):
post_dict = {'date': date, 'day_type': day_type, 'work_hours': work_hours, 'official_hours': official_hours, 'scheme': scheme}
form = DoctorsScheduleForm(post_dict)
form.save()
else:
form = DoctorsScheduleForm()