Как вывести данные из базы данных django?
Я хочу вывести список предметов которые привязаны к групе к которой привязан профиль, но выводит что-то непонятное:
Что я не так делаю с выводом?
- Вопрос задан более двух лет назад
- 2452 просмотра
1 комментарий
Простой 1 комментарий
Достаем данные из БД
В этой статье мы предполагаем, что вы уже знаете о моделях данных и как описываются их поля. О моделях можно узнать в статье Модели и поля.
В этой статье мы работаем с моделью данных для блога. Если бы мы хранили данные в таблице Excel, она бы выглядела так:
А для Django ORM эта таблица описывается так:
from django.db import models class Post(models.Model): title = models.CharField(max_length=200) text = models.TextField() created_date = models.DateTimeField() published_date = models.DateTimeField()
Эта модель называется Post и у неё есть 4 поля:
- title — заголовок поста, строка до 200 сиволов
- text — текст поста, строка произвольной длины
- created_date — дата и время создания поста, объект datetime
- published_date — дата и время публикации поста, объект datetime
Достать все
Чтобы достать все данные о постах, нам понадобится objects.all() :
posts = Post.objects.all() print(posts)
Вы увидите что-то такое:
Это 3 поста из базы данных. Как вы могли заметить, они лежат не в списке, а в QuerySet . Пока не будем вдаваться в подробности что это такое, главное, что им можно пользоваться как списком.
— объект поста из базы данных. У него есть заголовок, текст, даты создания и публикации… Всё то, что мы указывали у модели.
Давайте получим первый пост:
print(posts[0]) #
Довольно просто. Обратились по индексу, как будто это список — получили первый пост.
Достать данные из объекта
Как достать заголовок, текст и т. д. из ? Укажем поле, данные из которого хотим получить:
some_post = posts[0] print(some_post.title)
Заголовок хранится в поле title , вот его мы и указали. Вот что выведется в консоль:
Испытания дрейфующего стратостата. Запуск Рогозина и LoRa в стратосферу
А вот так можно вывести заголовки всех постов:
for post in posts: print(post.title)
Вот что выведется:
Испытания дрейфующего стратостата. Запуск Рогозина и LoRa в стратосферу Telegram. Безлимитный сетевой диск. Бесплатный 13 самых заминусованных статей минувшего года Почему ['1', '7', '11'].map(parseInt) возвращает [1, NaN, 3] в Javascript? .
Что читать дальше
Попробуйте бесплатные уроки по Python
Получите крутое код-ревью от практикующих программистов с разбором ошибок и рекомендациями, на что обратить внимание — бесплатно.
Переходите на страницу учебных модулей «Девмана» и выбирайте тему.
Как вывести таблицу из базы данных на сайт
Хочу вывести на сайт таблицу примерно вот так: Вот файл models.py:
from django.db import models from django.urls import reverse from datetime import date from django.contrib.auth.models import User import uuid class School_class(models.Model): school_class = models.CharField(max_length=10, help_text = 'Класс') def __str__(self): return self.school_class class People(models.Model): first_name = models.CharField(max_length=100, help_text = 'Имя учащегося') last_name = models.CharField(max_length=100, help_text = 'Фамилия учащегося') school_class = models.ForeignKey(School_class, help_text = 'Класс ученика', on_delete = models.SET_NULL, null=True) def __str__(self): return '<> <>'.format(self.first_name, self.last_name) class State(models.Model): date = models.DateField(help_text = 'Дата') status = models.CharField(max_length=10, choices = ( ('+', '+'), ('-', '-') )) people = models.ForeignKey(People, help_text = 'Фамилия, имя учащегося', on_delete = models.SET_NULL, null=True) def __str__(self): return '<> <>'.format(self.date, self.people.__str__()) def get_absolute_url(self): return reverse('date-detail', args=[str(self.id)]) class Meta: ordering = ['date']
Как вывести такие данные на сайт?
Отслеживать
задан 30 мая 2018 в 15:16
Александр Прощенков Александр Прощенков
23 6 6 бронзовых знаков
Как в django вывести таблицу
Рассмотрим базовые операции с моделями на простейшем примере. создание и вывод объектов модели на примере. Пусть, в файле models.py определена модель Person:
from django.db import models class Person(models.Model): name = models.CharField(max_length=20) age = models.IntegerField()
Определение представлений
В файле views.py пропишем четыре представления для получения, сохранения, редактирования и удаления данных:
from django.shortcuts import render from django.http import HttpResponseRedirect, HttpResponseNotFound from .models import Person # получение данных из бд def index(request): people = Person.objects.all() return render(request, "index.html", ) # сохранение данных в бд def create(request): if request.method == "POST": person = Person() person.name = request.POST.get("name") person.age = request.POST.get("age") person.save() return HttpResponseRedirect("/") # изменение данных в бд def edit(request, id): try: person = Person.objects.get(id=id) if request.method == "POST": person.name = request.POST.get("name") person.age = request.POST.get("age") person.save() return HttpResponseRedirect("/") else: return render(request, "edit.html", ) except Person.DoesNotExist: return HttpResponseNotFound("Person not found
") # удаление данных из бд def delete(request, id): try: person = Person.objects.get(id=id) person.delete() return HttpResponseRedirect("/") except Person.DoesNotExist: return HttpResponseNotFound("Person not found
")
В функции index() получаем все данные с помощью метода Person.objects.all() и передаем их в шаблон index.html.
В функции create() получаем данные из запроса типа POST, сохраняем данные с помощью метода save() и выполняем переадресацию на корень веб-сайта (то есть на функцию index).
Функция edit выполняет редактирование объекта. Функция в качестве параметра принимает идентификатор объекта в базе данных. И вначале по этому идентификатору мы пытаемся найти объект с помощью метода Person.objects.get(id=id) . Поскольку в случае отсутствия объекта мы можем столкнуться с исключением Person.DoesNotExist, то соответственно нам надо обработать подобное исключение, если вдруг будет передан несуществующий идентификатор. И если объект не будет найден, то пользователю возващается ошибка 404 через вызов return HttpResponseNotFound() .
Если объект найден, то обработка делится на две ветви. Если запрос POST, то есть если пользователь отправил новые изменненые данные для объекта, то сохраняем эти данные в бд и выполняем переадресацию на корень веб-сайта. Если запрос GET, то отображаем пользователю страницу edit.html с формой для редактирования объекта.
Функция delete аналогичным образом находит объет и выполняет его удаление.
Определение шаблонов
В папке templates определим шаблон index.html , который будет выводить данные на веб-страницу:
METANIT.COM
0 %>
Список пользователей
Id Имя Возраст > > > >">Изменить | >">Удалить
В начале шаблона определена форма для добавления данных, которые потом будет получать функция create в POST-запросе. А ниже определена таблица, в которую выводятся данные из переданного из представления набора people. В каждой строке определены ссылки на редактирование и удаление объекта.
Теперь добавим в папку templates файл edit.html со следующим содержимым:
METANIT.COM
>" />
>" />
Здесь определена форма для редактирования объекта. По нажатию на кнопку введенные на форму данные будут уходить по тому же адресу в запросе POST.
Установка маршрутов
И также в файле urls.py проекта свяжем маршруты с представлениями:
from django.urls import path from hello import views urlpatterns = [ path("", views.index), path("create/", views.create), path("edit//", views.edit), path("delete//", views.delete), ]
В итоге получится следующая структура проекта:
Запустим проект и обратимся к приложению в браузере. Вначале добавим несколько объектов через форму на веб-странице. И после каждого добавления мы увидим, как на веб-странице в таблице появляются новые данные:
Нажав на ссылку редактирования, мы перейдем к форме, где мы сможем изменить значения выбранного объекта:
Соответственно нажав на кнопку удаления в таблице объектов, мы удалим выбранный объект.