request.user.is_authenticated仅在主页上工作

时间:2019-05-27 11:55:19

标签: python django authentication

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

即使注销,request.user.is_authenticated在主页中为false,但在其他页面中为true。因此,下载按钮不会隐藏,也不会显示登录按钮。

我尝试使用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>

2 个答案:

答案 0 :(得分:0)

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 %}

答案 1 :(得分:0)

正如评论中指出的那样,您应该使用渲染快捷方式;似乎您将其与模板的render方法混淆了。没有理由直接在此处或在标准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)