Невозможно вызвать методы объектов в django '' function 'object не имеет атрибута' objects '" - PullRequest
0 голосов
/ 29 мая 2019

Я пытаюсь отобразить некоторые объекты из Django.Когда я использую администратора, мои объекты создаются, но когда я пытаюсь отобразить это невозможно.

Я пытался сделать рендер, но когда я инициализирую экран, он никогда не вызывается, затем я пытался сделать это с помощью кнопки GET, теперь функция вызывается, но когда приходит к alumnos = Alumno.objects.all () throws 'function' object не имеет атрибута 'objects'.

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 голосов
/ 29 мая 2019

На основании сообщения об ошибке и вашего комментария вы создали функцию представления с именем Alumno, например:

# app/views.py

from app.models import Alumno

def <b><s>Alumno</s></b>(request):
    # ...
    pass

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

Это означает, что если вы пишете Alumno.objects, вы ссылаетесь на функцию Alumno , даже если вы импортировали модель, поскольку вы просто установили идентификатор Alumno для этой функции, когда Вы определили это.

Самый простой способ решить эту проблему - переименовать ваше представление Alumno в alumno, что в соответствии с PEP-8 рекомендуемым способом присвоения имени вашей функции. В этом случае Alumno будет ссылаться на вашу импортированную модель.

# app/views.py

from app.models import <b>Alumno</b>

def <i>alumno</i>(request):
    # ...
    pass

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

Имя переменной шаблона, вероятно, должно быть 'alumnos' вместо Alumno, в вашем шаблоне вы можете отобразить это с помощью:

{% if <b>alumnos</b> %}
<ul>

    {% for alumno in <b>alumnos</b> %}
        <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 %}

Обратите внимание, что вам не нужно определять objects = models.Manager() в ваших моделях. Если вы не укажете другого менеджера, Django автоматически добавит в него менеджера с именем objects.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...