'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):
    # …