Обработка ситуации, когда у Django UpdateView нет данных для обновления
Я создал мастер форм, где пользователь сможет создавать и обновлять данные для моделей, после чего я рассчитаю результат, собрав все данные из всех форм, и представлю их на выходе.
Мой пользователь
может продолжить заполнение данных при повторном посещении. Каждый CreateView
связан со следующим CreateView
с помощью success_urls
.
Таким образом, каждый UpdateView
переходит к следующему UpdateView в серии представлений, используя success_urls.
Таким образом, когда пользователь обновляет данные в форме и нажимает кнопку «Далее», он может попасть в форму, в которой нет данных для обновления, поскольку он не заполнил их при предыдущем посещении.
Поэтому функция get_object() возвращает ошибку, так как в базе данных нет данных для этой формы проекта.
Как справиться с этой ситуацией?
class UserUseUpdateView(UpdateView):
model = UserUse
form_class = UserUseForm
template_name = 'user_use.html'
success_url = reverse_lazy('controller', kwargs={'step': 10, 'action': 'update'})
def get_object(self, queryset=None):
try:
project_instance = get_project(self.request)
return UserUse.objects.get(project=project_instance)
except Project.DoesNotExist:
return redirect('step-9-create')
# raise Http404(f'Project not found.')
except UserUse.DoesNotExist:
raise Http404(f'UserUse for project not found.')
def form_valid(self, form):
try:
existing_project = get_project(request=self.request)
if existing_project is not None:
form.instance.project = existing_project
log.info(f'Saving UserUse with project ID {existing_project.id} for user {self.request.user}')
return super().form_valid(form)
else:
error_msg = f"Existing project with SESSION_PROJECT_ID {self.request.session.get(SESSION_PROJECT_ID, None)} not found"
log.error(f'request user : {self.request.user} {error_msg}')
messages.error(self.request, 'Existing project not found.')
return redirect('step-1-create')
except PermissionDenied as e:
log.error(f'request user : {self.request.user} does not have permission to modify this project | {e}')
messages.error(self.request, 'You do not have permission to modify this project.')
return redirect('projects')
except Exception as e:
log.error(f'request user : {self.request.user} Unexpected error occurred | {e}')
messages.error(self.request, 'An unexpected error occurred.')
return redirect('projects')
def form_invalid(self, form):
log.error(f'request user : {self.request.user} Form invalid: {form.errors}')
messages.error(self.request, 'There were errors in your form submission.')
return super().form_invalid(form)