无法在Django中调用对象方法“函数”对象没有属性“对象””

时间:2019-05-28 22:03:39

标签: python django

我正在尝试显示Django的一些对象。当我使用管理员时,将创建我的对象,但是当我尝试显示它时,这是不可能的。

我试图进行渲染,但是当我初始化屏幕时从来没有调用过,然后我试图使用GET按钮来进行渲染,现在调用了该函数,但是当到达alumnos = Alumno.objects.all()时抛出 “功能”对象没有属性“对象”。

models.py

class Alumno(models.Model):
    dni = models.CharField(max_length=9,primary_key=True)
    nombre = models.CharField(max_length=100)
    apellido1 = models.CharField('Primer apellido',max_length=50)
    apellido2 = models.CharField('Segundo apellido',max_length=50)
    email = models.EmailField("Correo electronico",null=True)
    repetidor = models.BooleanField()
    curs = models.ManyToManyField(Curso, blank=True, related_name="Historico_de_cursos")
    Nivel = models.ManyToManyField('Nivel', through = 'Completado',through_fields=('Alumno','Nivel'))
    Practica = models.ManyToManyField('Practica', through = 'Nota',through_fields=('Alumno','Practica'))
    Curso = models.ManyToManyField('Curso',through = 'Curso_alumno',through_fields=('Alumno','Curso'))

objects = models.Manager()

def __str__(self):
    return self.dni

class Meta:
    db_table = "Alumno"
    verbose_name = 'Alumno'
    verbose_name_plural = 'Alumnos'
    unique_together = ("nombre", "apellido1", "apellido2")

view.py

def mostrar_alumnos(request):
    alumnos = Alumno.objects.all()
    return render(request, 'mostrar_alumnos.html', {'alumnos': alumnos}

mostrar_alumnos.html

{% if alumnos %}
    <ul>
    {% for alumno in alumnos %}
    <td>{{ alumno.dni }}</td>
    <td>{{ alumno.nombre }}</td>
    <td>{{ alumno.apellido1 }}</td>
    <td>
     <a class="btn btn-secondary" href="{% url 'actualizar_alumno' alumno.dni %}"> Editar</a>
    <a class="btn btn-danger" href="{% url 'eliminar_alumno' alumno.dni %}"> Esborrar</a> </td>
{% endfor %}
    </ul>
{% else %}
    <p>No hay alumnos disponibles.</p>
{% endif %}

url.py

url(r'^mostrar_alumnos/$', TemplateView.as_view(template_name='mostrar_alumnos.html'),name='mostrar_alumnos'),
url(r'^mostrar_alumnos/$', views.mostrar_alumnos,name='mostrar_alumnos'),
url(r'^mostrar_alumnos2/$', views.mostrar_alumnos2,name='mostrar_alumnos2')

1 个答案:

答案 0 :(得分:0)

根据错误消息和your comment,您构造了一个名为Alumno的视图函数,如下所示:

# app/views.py

from app.models import Alumno

def Alumno(request):
    # ...
    pass

def mostrar_alumnos(request):
    alumnos = Alumno.objects.all()
    return render(request, 'mostrar_alumnos.html', {'Alumno': alumnos})

这意味着如果您编写了Alumno.objects,则即使您导入了模型,也要引用Alumno 功能。 }}定义该函数时的标识符。

解决此问题的最简单方法是将Alumno视图重命名为Alumno,根据PEP-8,这是命名函数的推荐方法。在这种情况下,alumno将引用您导入的模型。

Alumno

模板变量的名称可能应为# app/views.py from app.models import Alumno def alumno(request): # ... pass def mostrar_alumnos(request): alumnos = Alumno.objects.all() return render(request, 'mostrar_alumnos.html', {'alumnos': alumnos})而不是'alumnos',然后在模板中使用以下命令呈现该变量:

Alumno

请注意,您不必在模型中定义{% if alumnos %} <ul> {% for alumno in alumnos %} <td>{{ Alumno.dni }}</td> <td>{{ Alumno.nombre }}</td> <td>{{ Alumno.apellido1 }}</td> <td> <a class="btn btn-secondary" href="{% url 'actualizar_alumno' alumno.dni %}"> Editar</a> <a class="btn btn-danger" href="{% url 'eliminar_alumno' alumno.dni %}"> Esborrar</a> </td> {% endfor %} </ul> {% endif %}。如果您未指定其他管理员,则Django会自动向其中添加名为objects = models.Manager()的管理员。