Как проверить, успешно ли сохранена запись в Django?
Могли бы вы взглянуть на этот код ниже?
Кажется, что форма успешно отправлена и проверена. Однако, похоже, что она не сохраняется в моей базе данных. Пожалуйста, проверьте мой комментарий в методе post() ниже, начиная с #####. Я знаю, что в PHP можно print_r($var); exit; но не могу найти эквивалент в Python/Django.
class ReportListView(ListView):
model = ReportList
form_class = ReportListForm
initial = {}
context_object_name = 'reportlists'
template_name = "reports.html"
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
#context['now'] = timezone.now()
return context
def get_queryset(self):
return ReportList.objects.filter(user=self.request.user)
def get(self, request, *args, **kwargs):
form = self.form_class(initial=self.initial)
return render(request, self.template_name, {'form': form})
def post(self, request, *args, **kwargs):
form = self.form_class(request.POST)
if form.is_valid():
# process form cleaned data
# name = form.cleaned_data.get('name') # .lower()
new_report = form.save(commit=False)
new_report.user = self.request.user
new_report.save()
### what can I write to check if new report has been saved?
### also, how can I print something here to print that in the browser e.g.
### print(datavariable)
### exit() ?? or something to stop execution here so that I read previous print output
return redirect('report')
return render(request, self.template_name, {'form': form})
Просто можно проверить, есть ли у новой_записи id:
created = new_record.id
например:
if not created:
raise # or other stuff
Если сохранение .save() закончится неудачей. Django выбросит исключение. Вам не стоит беспокоиться об этом. но вы можете попробовать выполнить запрос фильтра и посмотреть, будет ли создан объект. (но это не рекомендуется. это вызовет дополнительный удар по БД)
Я знаю, в чем проблема. Если вы попытаетесь вывести что-либо из get_context_data() или get_queryset(), это не удастся, потому что вы указали свой контекст в методе get(). Поэтому и get_context_data(), и get_queryset() не будут вызваны. В вашем случае вы хотите модифицировать метод get() и избавиться от двух предыдущих методов, о которых я упоминал, поэтому ваш код в get() будет выглядеть так:
def get(self, request, *args, **kwargs):
form = self.form_class(initial=self.initial)
reportlists = ReportList.objects.filter(user=self.request.user)
return render(request, self.template_name, {'form': form, 'reportlists': reportlists}})
Переписывание get() и post() - это то, что в конечном итоге будет источником содержимого вашего шаблона. Теперь я определил reportlists в вашем методе get(), и отправил его через контекст в шаблон, так что он будет доступен под именем reportlists в самом шаблоне. Теперь весь код может выглядеть следующим образом:
class ReportListView(ListView):
model = ReportList
form_class = ReportListForm
initial = {}
template_name = "reports.html"
def get(self, request, *args, **kwargs):
form = self.form_class(initial=self.initial)
reportlists = ReportList.objects.filter(user=self.request.user)
return render(request, self.template_name, {'form': form, 'reportlists': reportlists})
def post(self, request, *args, **kwargs):
form = self.form_class(request.POST)
if form.is_valid():
# process form cleaned data
# name = form.cleaned_data.get('name') # .lower()
new_report = form.save(commit=False)
new_report.user = self.request.user
new_report.save()
return redirect('report')
return render(request, self.template_name, {'form': form})