Это потому, что в вашей модели Profile
вы добавляете столбец user
в качестве ForeignKey, который приводит к NOT NULL
, так что выдает ошибку. Чтобы решить эту проблему, вам нужно изменить метод add_image
примерно так:
@login_required
def add_image(request):
form = ProfileImageForm()
#form.user = request.user
if request.method == "POST":
form = ProfileImageForm(data=request.POST, files=request.FILES)
if form.is_valid():
form = form.save(commit=False) # change is here
form.user=request.user.pk # change is here
form.save()
return redirect('userPage')
else:
return render(request, "users/user_image_form.html", {"form": form
Значение request.user.pk
получить, если вы вошли в систему. Но если вы вошли в систему, вам нужно указать form.user = your_specified_id
, какой идентификатор существует в таблице User
. Если ваш случай таков, вы являетесь администратором, и вам нужно добавить изображение другим пользователям, так что вам нужно передать идентификатор пользователя в вашем методе add_image
.
Добавить в ProfileImageForm.py
добавить user
в список полей
Я нашел решение для этого:
logger = logging.getLogger('my-logger')
logger.propagate = False
# now if you use logger it will not log to console.
Это предотвратит ведение журнала из отправляется в верхний регистратор, который включает ведение журнала консоли.
Если Вы хотите, отключают определенный регистратор временно, вот то, что, сделал.
Журнал В качестве примера
2019-10-02 21:28:45,663 django.request PID: 8 Internal Server Error: /service_portal/get_all_sites
Код
django_request_logger = logging.getLogger('django.request')
django_request_logger.disabled = True
django_request_logger.disabled = False
Путем изменения одного уровня в "logging.config.dictConfig" Вы сможете взять целый уровень входа к новому уровню.
logging.config.dictConfig({
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'console': {
'format': '%(name)-12s %(levelname)-8s %(message)s'
},
'file': {
'format': '%(asctime)s %(name)-12s %(levelname)-8s %(message)s'
}
},
'handlers': {
'console': {
'class': 'logging.StreamHandler',
'formatter': 'console'
},
#CHANGE below level from DEBUG to THE_LEVEL_YOU_WANT_TO_SWITCH_FOR
#if we jump from DEBUG to INFO
# we won't be able to see the DEBUG logs in our logging.log file
'file': {
'level': 'DEBUG',
'class': 'logging.FileHandler',
'formatter': 'file',
'filename': 'logging.log'
},
},
'loggers': {
'': {
'level': 'DEBUG',
'handlers': ['console', 'file'],
'propagate': False,
},
}
})
Найденный изящным решением с помощью [1 110] декораторы , который решает следующую проблему: что, если Вы пишете модуль с несколькими функциями, каждым из них с несколькими сообщениями отладки, и Вы хотите отключить вход в систему всех функций, но тот Вы в настоящее время фокусируетесь на?
можно сделать это с помощью декораторов:
import logging, sys
logger = logging.getLogger()
logging.basicConfig(stream=sys.stderr, level=logging.DEBUG)
def disable_debug_messages(func):
def wrapper(*args, **kwargs):
prev_state = logger.disabled
logger.disabled = True
result = func(*args, **kwargs)
logger.disabled = prev_state
return result
return wrapper
Затем можно сделать:
@disable_debug_messages
def function_already_debugged():
...
logger.debug("This message won't be showed because of the decorator")
...
def function_being_focused():
...
logger.debug("This message will be showed")
...
, Даже если Вы звоните function_already_debugged
из function_being_focused
, сообщения отладки от function_already_debugged
не будут, показал. Это гарантирует наблюдение только сообщений отладки от функции, на которой Вы фокусируетесь.
Hope это помогает!
Вы можете использовать:
logging.basicConfig(level=your_level)
где your_level является одним из следующих:
'debug': logging.DEBUG,
'info': logging.INFO,
'warning': logging.WARNING,
'error': logging.ERROR,
'critical': logging.CRITICAL
Итак, если вы установите your_level на logging.CRITICAL , вы будут получать только критические сообщения, отправленные:
logging.critical('This is a critical error message')
Установка your_level на logging.DEBUG покажет все уровни ведения журнала.
Для получения дополнительных сведений ознакомьтесь с примерами ведения журнала .
Таким же образом, чтобы изменить уровень для каждого обработчика, используйте функцию Handler.setLevel () .
import logging
import logging.handlers
LOG_FILENAME = '/tmp/logging_rotatingfile_example.out'
# Set up a specific logger with our desired output level
my_logger = logging.getLogger('MyLogger')
my_logger.setLevel(logging.DEBUG)
# Add the log message handler to the logger
handler = logging.handlers.RotatingFileHandler(
LOG_FILENAME, maxBytes=20, backupCount=5)
handler.setLevel(logging.CRITICAL)
my_logger.addHandler(handler)
Нет необходимости перенаправлять стандартный вывод. Вот лучший способ сделать это:
import logging
class MyLogHandler(logging.Handler):
def emit(self, record):
pass
logging.getLogger().addHandler(MyLogHandler())
Еще более простой способ:
logging.getLogger().setLevel(100)
Я не очень хорошо знаю модуль логирования, но я использую его так, как обычно хочу отключить только отладочные (или информационные) сообщения. Вы можете использовать Handler.setLevel()
для установки уровня логирования на CRITICAL или выше.
Также, вы можете заменить sys.stderr и sys.stdout на файл, открытый для записи. См. http://docs.python.org/library/sys.html#sys. stdout. Но я бы не рекомендовал этого делать.
Я использую:
logger = logging.getLogger()
logger.disabled = True
... whatever you want ...
logger.disabled = False