【问题标题】:'function' object has no attribute 'get' in django'function'对象在django中没有属性'get'
【发布时间】:2020-11-13 12:36:45
【问题描述】:

我试图让用户只有在登录时才能提出问题。

这是我在终端窗口中遇到的错误:

    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

我试图只允许登录的用户提问,如果用户没有登录,他将被重定向到登录页面。但它给了我一个错误。

【问题讨论】:

    标签: python django forms decorator


    【解决方案1】:

    你需要在装饰器中调用函数,并返回函数的结果,而不是函数本身:

    def usersOnly(view_func):
        def func(request, *args, **kwargs):
            if request.user.is_authenticated:
                return view_func(request, *args, **kwargs)
            else:
                return redirect('login')
        return func

    但是你在这里的目标已经存在。您可以使用@login_required decorator [Django-doc]

    from django.contrib.auth.decorators import login_required
    from django.urls import reverse_lazy
    
    @login_required(login_url=reverse_lazy('login'))
    def ask_question(request):
        # …

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-22
      • 2017-07-07
      • 1970-01-01
      • 1970-01-01
      • 2021-01-12
      • 2016-12-08
      • 2018-05-07
      • 2017-10-14
      相关资源
      最近更新 更多