Ищу решение следующей проблемы:
У меня есть основная функция, которая содержит множество типов QuerySets и кодов Python. В этой функции есть много запросов, которые нужно запускать только после аутентификации пользователя. Я знаю, что когда я использую @login_required перед функцией, я могу аутентифицировать пользователя, но как я могу использовать аутентификацию внутри функции?
Мой пример кода:
def auth(request):
username = request.POST['username']
password = request.POST['password']
user = authenticate(request, username=username, password=password)
if user is not None:
login(request, user)
return render(request, 'project/index.html')
else:
login(request, user)
def dashboard_data(request):
qs1 = MyModel.objects.all()
qs2 = MyModel.objects.all()
qs3 = MyModel.objects.all()
#Lets say I want to run the the following queries when user logged in
qs_logged1 = MyModel.objects.all()
qs_logged2 = MyModel.objects.all()
send_data = {
'qs1': qs1,
'qs2': qs2,
'qs3': qs3,
'qs_logged1':qs_logged1,
'qs_logged2':qs_logged2
}
return render(request, 'project/index.html', send_data)
Как я мог запускать запросы только тогда, когда пользователь вошел в систему?






def dashboard_data(request):
qs1 = MyModel.objects.all()
qs2 = MyModel.objects.all()
qs3 = MyModel.objects.all()
if request.user.is_authenticated:
qs_logged1 = MyModel.objects.all()
qs_logged2 = MyModel.objects.all()
send_data = {
'qs1': qs1,
'qs2': qs2,
'qs3': qs3,
'qs_logged1': qs_logged1,
'qs_logged2': qs_logged2
}
return render(request, 'project/index.html', send_data)
else:
send_data = {
'qs1': qs1,
'qs2': qs2,
'qs3': qs3,
}
return render(request, 'project/index.html', send_data)
Ваш ответ мне очень помог, я дважды не использовал send_data, после else я определил пустые переменные (например, qs_logged1=[]), и после этого функция работала правильно.
Вы можете использовать is_authenticated для проверки, вошел ли пользователь в систему или нет
def dashboard_data(request):
if request.user.is_authenticated:
# do something with authenticated user
else:
# do something without authenticated user
return something
Вы также можете обратиться к это сообщение SO для того же
Зачем нужны два разных определения send_data и два разных вызова для рендеринга ???