Вы можете попытаться узнать, какая форма была отправлена, добавив атрибут name
к кнопкам:
<button class="btn btn-outline-info" type="submit" name="save_changes">Save changes</button>
...
<button class="btn btn-danger" type="submit" name="delete">Delete</button>
Затем, на ваш взгляд:
if request.method == 'POST':
if 'save_changes' in request.POST: # handle editing form
user_CreditCardForm = CreditCardForm(request.POST, instance=currentCreditCard)
if user_CreditCardForm.is_valid():
...
elif 'delete' in request.POST: # handle deleting
...
Таким образом, когда вы удаляете вы не попадете на if user_CreditCardForm.is_valid():
, которая вызывает проблему.
Вы должны использовать макросы препроцессора __LINE__
и __FILE__
. Они являются предопределенными макросами и частью стандарта C/C++. Во время препроцессирования они заменяются соответственно на константную строку, содержащую целое число, представляющее номер текущей строки, и на имя текущего файла.
Другие переменные препроцессора :
__func__
: имя функции (это часть C99, не все компиляторы C++ поддерживают его)__DATE__
: строка вида "Mmm dd yyyy"__TIME__
: строка вида "hh:mm:ss"Ваш код будет :
if(!Logical)
printf("Not logical value at line number %d in file %s\n", __LINE__, __FILE__);
C++ 20 предложений новый способ достигнуть этого при помощи станд.:: source_location. Это в настоящее время доступно в как std::experimental::source_location
.
проблема с макросами как __LINE__
состоит в том, что, если Вы хотите создать a, например, регистрирующаяся функция, которая производит текущий номер строки наряду с сообщением, Вы всегда, должна передавать __LINE__
как аргумент функции, потому что это расширено на сайте вызова. Что-то вроде этого:
void log(const std::string msg) {
std::cout << __LINE__ << " " << msg << std::endl;
}
будет всегда производить строку объявления функции а не строку, где log
был на самом деле назван. С другой стороны, с std::source_location
можно записать что-то вроде этого:
void log(const std::string msg,
const std::source_location loc = std::experimental::source_location::current()) {
std::cout << loc.line() << " " << msg << std::endl;
}
Здесь, loc
инициализируется с номером строки, указывающим на местоположение, где log
был назван.
Попробуйте __ FILE __
и __ LINE __
.
Вам также могут пригодиться __ DATE __
и __ TIME __
.
Хотя, если вам не нужно отлаживать программу на стороне клиента и, следовательно, регистрировать эту информацию, вам следует использовать обычную отладку.
В рамках стандарта C++ существуют некоторые предопределенные макросы, которые вы можете использовать. Раздел 16.8 стандарта C++ определяет, среди прочего, макрос __LINE__
.
__LINE__
: Номер строки текущего исходного текста (десятичная константа). константа).
__FILE__
: Предполагаемое имя исходного файла (символьный строковый литерал).
__DATE__
: Дата перевода исходного файла (литерал символьной строки литерал...)
__TIME__
: Время перевода исходного файла (символьная строка литерал...)
__STDC__
: Является ли__STDC__
предопределенным
__cplusplus
: Имя__cplusplus
определяется значением 199711L при компиляции блока трансляции C ++
Таким образом, ваш код будет выглядеть так:
if(!Logical)
printf("Not logical value at line number %d \n",__LINE__);
Используйте __LINE__
(это double-underscore LINE double-underscore), препроцессор заменит его на номер строки, на которой он встречается.