'function' 对象在 Django 中没有属性 'get'
'function' object has no attribute 'get' in django
我试图让用户只有在登录后才能提问。
这是我在终端中遇到的错误 window:
Internal Server Error: /ask_question/
Traceback (most recent call last):
File "/home/rayan/.local/lib/python3.8/site-packages/django/core/handlers/exception.py", line 34, in inner
response = get_response(request)
File "/home/rayan/.local/lib/python3.8/site-packages/django/utils/deprecation.py", line 96, in __call__
response = self.process_response(request, response)
File "/home/rayan/.local/lib/python3.8/site-packages/django/middleware/clickjacking.py", line 26, in process_response
if response.get('X-Frame-Options') is not None:
AttributeError: 'function' object has no attribute 'get'
[23/Jul/2020 17:19:16] "GET /ask_question/ HTTP/1.1" 500 62327
我正在使用装饰器,这是我 decorators.py:
中的代码
def usersOnly(view_func):
def func(request, *args, **kwargs):
if request.user.is_authenticated:
return view_func
else:
return redirect('login')
return func
这是我的代码 views.py:
@usersOnly
def ask_question(request):
form = AskQuestion()
if request.method == "POST":
asker = request.user
form = AskQuestion(request.POST)
if form.is_valid():
form.save()
id = form.cleaned_data.get('id')
return redirect(f'/question/{id}/')
dic = {
"form":form,
}
return render(request, 'blogs/ask_question.html', dic)
这是我的代码 models.py:
class Question(models.Model):
title = models.CharField(max_length=250)
asker = models.ForeignKey(User,on_delete=models.CASCADE)
text = models.TextField()
pub_date = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.title
我试图只允许登录用户提问,如果用户没有登录,他将被重定向到登录页面。但它给我一个错误。
你需要调用装饰器中的函数,return函数的结果,而不是函数本身:
def usersOnly(view_func):
def func(request, *args, **kwargs):
if request.user.is_authenticated:
return <b>view_func(request, *args, **kwargs)</b>
else:
return redirect('login')
return func
但是你来这里的目的,已经存在了。您可以使用 @login_required
decorator [Django-doc]:
from django.contrib.auth.decorators import <b>login_required</b>
from django.urls import reverse_lazy
<b>@login_required(login_url=reverse_lazy('login'))</b>
def ask_question(request):
# …
我试图让用户只有在登录后才能提问。
这是我在终端中遇到的错误 window:
Internal Server Error: /ask_question/
Traceback (most recent call last):
File "/home/rayan/.local/lib/python3.8/site-packages/django/core/handlers/exception.py", line 34, in inner
response = get_response(request)
File "/home/rayan/.local/lib/python3.8/site-packages/django/utils/deprecation.py", line 96, in __call__
response = self.process_response(request, response)
File "/home/rayan/.local/lib/python3.8/site-packages/django/middleware/clickjacking.py", line 26, in process_response
if response.get('X-Frame-Options') is not None:
AttributeError: 'function' object has no attribute 'get'
[23/Jul/2020 17:19:16] "GET /ask_question/ HTTP/1.1" 500 62327
我正在使用装饰器,这是我 decorators.py:
中的代码def usersOnly(view_func):
def func(request, *args, **kwargs):
if request.user.is_authenticated:
return view_func
else:
return redirect('login')
return func
这是我的代码 views.py:
@usersOnly
def ask_question(request):
form = AskQuestion()
if request.method == "POST":
asker = request.user
form = AskQuestion(request.POST)
if form.is_valid():
form.save()
id = form.cleaned_data.get('id')
return redirect(f'/question/{id}/')
dic = {
"form":form,
}
return render(request, 'blogs/ask_question.html', dic)
这是我的代码 models.py:
class Question(models.Model):
title = models.CharField(max_length=250)
asker = models.ForeignKey(User,on_delete=models.CASCADE)
text = models.TextField()
pub_date = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.title
我试图只允许登录用户提问,如果用户没有登录,他将被重定向到登录页面。但它给我一个错误。
你需要调用装饰器中的函数,return函数的结果,而不是函数本身:
def usersOnly(view_func):
def func(request, *args, **kwargs):
if request.user.is_authenticated:
return <b>view_func(request, *args, **kwargs)</b>
else:
return redirect('login')
return func
但是你来这里的目的,已经存在了。您可以使用 @login_required
decorator [Django-doc]:
from django.contrib.auth.decorators import <b>login_required</b>
from django.urls import reverse_lazy
<b>@login_required(login_url=reverse_lazy('login'))</b>
def ask_question(request):
# …