【问题标题】:request.user.is_authenticated working only in the home pagerequest.user.is_authenticated 仅在主页中工作
【发布时间】:2019-05-27 21:14:28
【问题描述】:

我正在创建一个用户可以上传文档的网站。如果用户已注销,他可以查看其他人的文档但不能下载它 如果用户已登录,他可以从 pdf 查看器的工具栏中下载文档

即使我注销 request.user.is_authenticated 在主页中为假,但在其他页面中为真。所以下载按钮不会隐藏,也不会显示登录按钮。

我尝试过使用 user.is_authenticated 但它一直返回 true

if else 条件在索引页中可以正常工作,但在 doc_detail.html 中则不行

urls.py

re_path(r'^all_files/(?P<doc_id>[0-9]+)/$',views.doc_detail,name = 'doc_detail'),
path('login/',auth_views.LoginView.as_view(template_name='homework/login.html'),name = 'login'),

views.py

def doc_detail(request,doc_id):
    template = loader.get_template('homework/doc_detail.html')
    doc = get_object_or_404(Document, pk = doc_id)
    context = {
    'doc':doc
    }
    return HttpResponse(template.render(context,request))

doc_detail.html

{{ doc.user.username }}
{{ doc.title }}
{{ doc.doc_type }} <br>

{% if request.user.is_authenticated %}
    <iframe src="{{ doc.document.url }}#toolbar=1&navpanes=0&scrollbar=1" type="application/pdf" width = "80%" height = "600px" />
{% else %}
    <iframe src="{{ doc.document.url }}#toolbar=0&navpanes=0&scrollbar=0" type="application/pdf" width = "80%" height = "600px"  />
    <a href=" url 'homework:login'">login</a>
{% endif %}

索引页面

<!DOCTYPE html>
<html>
<head>
    <title></title>
</head>
<body>
This is the homework page implement upload-routine explore-routine here  
{% if request.user.is_authenticated %} 
the user is {{ request.user.email }} {{ request.user.profile.institution }}

{% else %}
user not logged in
{% endif %}

{% if request.user.is_authenticated %}
    <a href="{% url 'homework:logout' %}">logout</a>
    <a href="{% url 'homework:update' %}">update</a>
    <a href="{% url 'homework:upload' %}">upload</a>
    <a href="{% url 'homework:my_uploads' %}">my uploads</a><br>
{% else %}
    <a href="{% url 'homework:login' %}">login</a><br>
{% endif %}

<a href="{% url 'homework:all_files' %}">all files</a>
</body>
</html>

【问题讨论】:

标签: python django authentication


【解决方案1】:

正如 cmets 中所指出的,您应该使用渲染快捷方式;您似乎将其与模板的渲染方法混淆了。没有理由直接在这里使用模板对象,或者在标准 Django 代码中的任何地方使用。

def doc_detail(request, doc_id):
    doc = get_object_or_404(Document, pk=doc_id)
    context = {
        'doc':doc
    }
    return render(request, 'homework/doc_detail.html', context)

【讨论】:

  • 我已经尝试过这段代码,但它仍然无法正常工作,但现在我观察到,如果我在视图函数中检查 user.is_authenticated 它工作正常,但在呈现的模板 def all_files(request) : template = 'homework/all_files.html' docs = Document.objects.all() context = { 'docs': docs, } # if request.user.is_active: # print(request.user) if(request.user. is_authenticated): return render(request = request,template_name = template,context = context) else: return HttpResponseRedirect(reverse('homework:index')) 这按要求工作,但问题出现在 templ。
  • 您的模板 context_processors 设置中有'django.template.context_processors.request' 吗?显示该设置。
【解决方案2】:

views.py

@login_required
def doc_detail(request,doc_id):
    template = loader.get_template('homework/doc_detail.html')
    doc = get_object_or_404(Document, pk = doc_id)
    context = {
    'doc':doc
    }
    return HttpResponse(template.render(context,request))

doc_detail.html

{% if user.is_authenticated %}
    <iframe src="{{ doc.document.url }}#toolbar=1&navpanes=0&scrollbar=1" type="application/pdf" width = "80%" height = "600px" />
{% else %}
    <iframe src="{{ doc.document.url }}#toolbar=0&navpanes=0&scrollbar=0" type="application/pdf" width = "80%" height = "600px"  />
    <a href=" url 'homework:login'">login</a>
{% endif %}

【讨论】:

  • 重点是 doc_detail 视图应该可供非登录用户访问,但应隐藏特定内容。 @login_required 会让他们创建新帐户并登录,即使他们只是访问网站以浏览页面
  • 你只试user.is_authenticated
  • 还是没有运气:(
猜你喜欢
  • 2021-05-19
  • 1970-01-01
  • 1970-01-01
  • 2016-01-21
  • 1970-01-01
  • 2013-06-26
  • 1970-01-01
  • 2018-04-16
  • 1970-01-01
相关资源
最近更新 更多