我正在用Django开发个人日记应用。在那边,我做了一个应用程序“笔记”。笔记应用程序的models.py如下所示:
from django.db import models
from datetime import datetime
from django.contrib.auth.models import User
class Note(models.Model):
image=models.ImageField(upload_to='images/')
title=models.CharField(default="",max_length=20)
body=models.TextField(default="",max_length=800)
date=models.DateField(default=datetime.now())
publisher=models.ForeignKey(User,on_delete=models.CASCADE,default="")
def __str__(self):
return self.title
现在,当用户登录时,我想在其主页上仅显示他所做的注释条目。 views.py和home.html如下:
views.py:
@login_required
def home(request):
notes=Note.objects
return render(request,'home.html',{'notes':notes})
home.html:
{% extends 'basic.html' %}
{% load static %}
{% block content %}
{% if error %}
{{error}}
{% endif %}
{% for n in notes.all %}
{% ifequal request.user.username n.publisher %}
<div class="container">
<a href="{% url 'note_app:detail' n.id %}"><h3>{{n.title}}</h3></a>
<p>{{n.body}}</p>
<footer>{{n.date}}</footer>
</div>
{% endifequal %}
{% endfor %}
{% endblock %}
正如您在home.html中看到的那样,我正在遍历Note类的所有对象。当ifequal
语句不存在时,它将显示所有用户的所有条目,但是当我放置ifequal
语句以确保仅显示登录用户所做的条目时,它不会显示任何东西。有人可以告诉我如何解决这个问题吗?我绝对是Web开发领域的初学者,我事先为一个愚蠢的问题表示歉意,但我被困住了。
答案 0 :(得分:1)
我相信您的错误是在views.py中 尝试使用:
notes=Note.objects.all()
代替:
notes=Note.objects
答案 1 :(得分:0)
您只是缺少{% ifequal %}
的第二个参数。现在,您没有将任何事物进行比较。试试这个:
home.html:
{% extends 'basic.html' %}
{% load static %}
{% block content %}
{% if error %}
{{error}}
{% endif %}
{% for n in notes.all %}
{% ifequal request.user n.publisher %}
<div class="container">
<a href="{% url 'note_app:detail' n.id %}"><h3>{{n.title}}</h3></a>
<p>{{n.body}}</p>
<footer>{{n.date}}</footer>
</div>
{% endifequal %}
{% endfor %}
{% endblock %}
也就是说,我应该注意,您不必在模板中执行此操作。如果您在数据库中进行操作,它将更快。您可以将views.py
更改为此:
@login_required
def home(request):
notes = Note.objects.filter(publisher=request.user)
return render(request,'home.html',{'notes':notes})
这时您甚至不需要模板中的{% ifequal %}
标记。