Это, скорее всего, уже спрашивали раньше, но я не мог понять, что нужно гуглить. Я создаю простую форму, чтобы люди могли заполнить экран COVID для мероприятия. По сути, они нажимают на событие, а затем нажимают заполнить форму.
Я создал модель для этого как таковую:
class Response(models.Model):
""" model for a completed covid screen """
temperature = models.DecimalField(max_digits=5, decimal_places=2, default=98.6)
contact_with_covid = models.BooleanField(default=False)
account = models.ForeignKey(Account, on_delete=models.SET_NULL, null=True)
time = models.DateTimeField()
event = models.ForeignKey("Event", on_delete=models.CASCADE)
def __str__(self):
return f'{self.account.user.username}\'s response for "{self.event.title}"'
А также создал форму для заполнения пользователями для этого ответа.
class ResponseForm(forms.ModelForm):
class Meta:
model = Response
fields = ['temperature', 'contact_with_covid']
labels = {'contact_with_covid': 'Have you had contact with covid in the last 14 days?'}
help_texts = {'temperature': 'Your temperature in degrees.'}
Я не хотел, чтобы пользователь выбирал параметры account
, time
и event
. Их следует определить так:
request.user.account
datetime.datetime.now()
path('event/<uuid:event>/response/create', views.create_response, name='response-create')
Поэтому представление, которое у меня есть, устанавливает эти параметры в cleaned_data
после проверки формы.
@login_required
def create_response(request, event):
if request.method == "POST":
form = ResponseForm(request.POST)
if form.is_valid():
form.cleaned_data['account'] = request.user.account
form.cleaned_data['event'] = event
form.cleaned_data['time'] = datetime.datetime.now()
form.save()
messages.success(request, 'Your response has been recorded')
# return HttpResponseRedirect(reverse('home'))
return redirect('home')
else:
form = ResponseForm()
return render(request, 'prescreen/response_form.html', {'form': form})
Однако всякий раз, когда я отправляю форму, я получаю экран «Ошибка ограничения NOT NULL: prescreen_response.time».
Как это возможно, если я установил параметр time
для cleaned_data
?
Что мне делать, чтобы исправить это?
Я думаю, что проблема здесь в вашей форме, попробуйте сделать это так:
@login_required
def create_response(request, event):
if request.method == "POST":
form = ResponseForm(request.POST)
if form.is_valid():
response = form.save(commit=False)
account = request.user.account
event = form.cleaned_data['event']
time = datetime.datetime.now()
response.account = account
response.event = event
response.time = time
response.save()
messages.success(request, 'Your response has been recorded')
return redirect('home')
else:
form = ResponseForm()
return render(request, 'prescreen/response_form.html', {'form': form})
проблема также может заключаться в том, как вы определили свое поле DateTime в модели, попробуйте сделать это следующим образом: models.DateTimeField(auto_now_add=True)
а затем полностью пропустите часть времени в форме
В django... используйте
django.utils.timezone
, а не datetime. См. документацию или, как упомянул SLDem в конце своего поста, определите свою модель с помощьюauto_now_add=True
. Обновлено: это должен был быть комментарий к вопросу о плакатах. Но увы, теперь это здесь. Давайте катиться с ним.