Как проверить, успешно ли сохранена запись в 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})
Вернуться на верх