У меня есть приложение django, в котором есть некоторое промежуточное программное обеспечение (написанное в новом стиле), которое проверяет, не стало ли что-то, на что пользователь может зарегистрироваться, «заполненным», прежде чем пользователь завершил процесс регистрации для него.
Если он заполнен - промежуточное ПО выдает сообщение об ошибке, информирующее пользователя о том, что оно заполнено, и связывает его с регистрацией, чтобы они могли его изменить.
Промежуточное программное обеспечение выглядит так:
def __call__(self, request):
# Code to be executed for each request before
# the view (and later middleware) are called.
# ....extra logic (working without issue)....
full_problem_registrations = Registration.objects.filter(
id__in=full_problem_registration_ids
)
request.full_problem_registrations = full_problem_registrations
request.session['registration_now_full'] = False
if full_problem_registrations:
request.session['registration_now_full'] = True
for problem_reg in full_problem_registrations:
reg_url = reverse(
"camp_registrations:edit_registration", kwargs={
'person_id': problem_reg.person.id,
'registration_id': problem_reg.id,
}
)
url_string = '<a href="%s">' % reg_url
error_message = format_html(
"The %s %s registration for %s %s at %s</a> has become\
full and is no longer available. Please either remove\
or change this registration." % (
url_string,
problem_reg.course_detail.course.camp.name,
problem_reg.person.first_name,
problem_reg.person.last_name,
problem_reg.course_detail.location.name,
)
)
existing_messages = get_messages(request)
if existing_messages:
for message in get_messages(request):
# check for duplicates
if message.message == error_message:
pass
else:
messages.error(
request,
error_message,
)
else:
messages.error(
request,
error_message,
)
else:
pass
response = self.get_response(request)
# Code to be executed for each request/response after
# the view is called.
return response
Это прекрасно работает - отображается сообщение, позволяющее всем узнать, что у пользователя возникли проблемы с регистрацией.
Однако - когда пользователь входит, чтобы отредактировать свою регистрацию и переходит на неполный курс, и сохраняет его - при сохранении он перенаправляет его на следующую страницу.
На следующей странице отображается сообщение об успешном завершении, но также отображается сообщение об ошибке. Если пользователь обновляется или переходит на любую другую страницу сайта, сообщение об ошибке исчезает.
Это связано с тем, что промежуточное ПО обрабатывает до , а представление обрабатывается - и в то время ошибка все еще имеет значение.
Как лучше всего это исправить и не показывать?
Я полагал, что в промежуточном программном обеспечении после обработки представления (которое, как я полагаю, будет включать обработку данных POST), мы могли бы снова выполнить проверку и устранить ошибку, если она существует; но я не могу понять, как правильно удалить ошибку из сообщений.
response = self.get_response(request)
# Code to be executed for each request/response after
# the view is called.
# should I be checking here to see if the problem still exists and
# removing the message here?
Я пробовал это - но не могу понять, как удалить только это конкретное сообщение из объекта FallbackStorage
.
Формы обрабатываются с использованием представлений на основе классов (в частности, это UpdateView
)