Как загрузить данные в html из базы данных?
Привет. Есть у меня домашний проект, в нем развернут DRF, сама база данных на postgresql и я научился создавать шаблон страницы, НО без данных из базы. вот каким образом я это сделал:
$ mkdir static $ vim Project1/settings.py $ cat Project1/settings.py ... import os ... INSTALLED_APPS = [ ... 'django.contrib.staticfiles', ... ] TEMPLATES = [ { ... 'DIRS': [os.path.join(BASE_DIR, 'david138it')], 'APP_DIRS': True, ... ... # https://docs.djangoproject.com/en/5.0/howto/static-files/ STATIC_URL = '/static/' STATICFILES_DIRS = [ os.path.join(BASE_DIR, "static"), ] ... $ mv Project2/css static/ $ ls static/ css $ vim Project2/index.html $ cat Project2/index.html {% load static %} <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0"> <link rel="stylesheet" href="{% static 'css/style.css' %}"> ... <script src="{% static 'js/jquery.js' %}"></script> <script src="{% static 'js/main.js' %}"></script> </body> </html> $ python manage.py runserver $ google-chrome http://IP:8000/contents/ |
$ mkdir static $ vim Project1/settings.py $ cat Project1/settings.py ... import os ... INSTALLED_APPS = [ ... 'django.contrib.staticfiles', ... ] TEMPLATES = [ { ... 'DIRS': [os.path.join(BASE_DIR, 'david138it')], 'APP_DIRS': True, ... ... # https://docs.djangoproject.com/en/5.0/howto/static-files/ STATIC_URL = '/static/' STATICFILES_DIRS = [ os.path.join(BASE_DIR, "static"), ] ... $ mv Project2/css static/ $ ls static/ css $ vim Project2/index.html $ cat Project2/index.html {% load static %} <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0"> <link rel="stylesheet" href="{% static 'css/style.css' %}"> ... <script src="{% static 'js/jquery.js' %}"></script> <script src="{% static 'js/main.js' %}"></script> </body> </html> $ python manage.py runserver $ google-chrome http://IP:8000/contents/
Да. сайт открывается но без данных из базы. Начал дополнять код для загрузки данных уже из базы таким образом:
$ vim portfolio/models.py $ cat portfolio/models.py ... class Place(models.Model): title = models.CharField(max_length=255, verbose_name="Место работы") ... class Meta: ordering = ["-title"] def __str__(self): return self.title class Portfolio(models.Model): title = models.TextField(verbose_name="Достижение") ... def __str__(self): return self.title ... $ python manage.py makemigrations $ python manage.py migrate $ vim portfolio/views.py $ cat portfolio/views.py ... from django.views.generic import ListView ... class PortfolioListView(ListView): model = Portfolio $ vim Project1/urls.py $ cat Project1/urls.py ... from portfolio.models import Portfolio from portfolio.views import PortfolioListView urlpatterns = [ ... path('contents/', views.show_contents), path('portfolio2/', PortfolioListView.as_view()), ]+static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) $ vim Project2/content_list.html $ cat Project2/content_list.html {% extends "index.html" %} {% block content %} <h2>Content</h2> <ul> {% for content in object_list %} <li>{{ content.title }}</li> {% endfor %} </ul> {% endblock %} $ google-chrome http://IP:8000/portfolio2/ ... Internal Server Error: /portfolio2/ Traceback (most recent call last): File "/home/USER/pyenv/lib/python3.10/site-packages/django/core/handlers/exception.py", line 55, in inner response = get_response(request) File "/home/USER/pyenv/lib/python3.10/site-packages/django/core/handlers/base.py", line 220, in _get_response response = response.render() File "/home/USER/pyenv/lib/python3.10/site-packages/django/template/response.py", line 114, in render self.content = self.rendered_content File "/home/USER/pyenv/lib/python3.10/site-packages/django/template/response.py", line 90, in rendered_content template = self.resolve_template(self.template_name) File "/home/USER/pyenv/lib/python3.10/site-packages/django/template/response.py", line 72, in resolve_template return select_template(template, using=self.using) File "/home/USER/pyenv/lib/python3.10/site-packages/django/template/loader.py", line 47, in select_template raise TemplateDoesNotExist(", ".join(template_name_list), chain=chain) django.template.exceptions.TemplateDoesNotExist: portfolio/portfolio_list.html [06/Apr/2024 03:20:15] "GET /portfolio2/ HTTP/1.1" 500 83529 |
$ vim portfolio/models.py $ cat portfolio/models.py ... class Place(models.Model): title = models.CharField(max_length=255, verbose_name="Место работы") ... class Meta: ordering = ["-title"] def __str__(self): return self.title class Portfolio(models.Model): title = models.TextField(verbose_name="Достижение") ... def __str__(self): return self.title ... $ python manage.py makemigrations $ python manage.py migrate $ vim portfolio/views.py $ cat portfolio/views.py ... from django.views.generic import ListView ... class PortfolioListView(ListView): model = Portfolio $ vim Project1/urls.py $ cat Project1/urls.py ... from portfolio.models import Portfolio from portfolio.views import PortfolioListView urlpatterns = [ ... path('contents/', views.show_contents), path('portfolio2/', PortfolioListView.as_view()), ]+static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) $ vim Project2/content_list.html $ cat Project2/content_list.html {% extends "index.html" %} {% block content %} <h2>Content</h2> <ul> {% for content in object_list %} <li>{{ content.title }}</li> {% endfor %} </ul> {% endblock %} $ google-chrome http://IP:8000/portfolio2/ ... Internal Server Error: /portfolio2/ Traceback (most recent call last): File "/home/USER/pyenv/lib/python3.10/site-packages/django/core/handlers/exception.py", line 55, in inner response = get_response(request) File "/home/USER/pyenv/lib/python3.10/site-packages/django/core/handlers/base.py", line 220, in _get_response response = response.render() File "/home/USER/pyenv/lib/python3.10/site-packages/django/template/response.py", line 114, in render self.content = self.rendered_content File "/home/USER/pyenv/lib/python3.10/site-packages/django/template/response.py", line 90, in rendered_content template = self.resolve_template(self.template_name) File "/home/USER/pyenv/lib/python3.10/site-packages/django/template/response.py", line 72, in resolve_template return select_template(template, using=self.using) File "/home/USER/pyenv/lib/python3.10/site-packages/django/template/loader.py", line 47, in select_template raise TemplateDoesNotExist(", ".join(template_name_list), chain=chain) django.template.exceptions.TemplateDoesNotExist: portfolio/portfolio_list.html [06/Apr/2024 03:20:15] "GET /portfolio2/ HTTP/1.1" 500 83529
столкнулся с проблемой при загрузки страницы porftolio2. то есть ругается на какую страницу из portfolio_list хотя я написал в content_list. делал я по странице https://docs.djangoproject.com/en/5.0/topics/class... Что я не правильно сделал???
Дополнительно:
Как загрузить данные в html из базы данных?
Что я не правильно сделал???
ты вообще читаешь, что тебе пишут в ошибке, как то что django не может найти шаблон связано с "загрузить данные в html из базы данных"?
'DIRS': [os.path.join(BASE_DIR, 'david138it')],
вот что это за треш? зачем ты такое написал? ты понимаешь что такое BASE_DIR?
хотя я написал в content_list.
да это ты себе написал, но ты django про это не рассказал
Ты вообще доки читаешь, там явно указано где CBV хотят искать шаблоны, да даже в ошибке тебе про это пишут
покажу на своём простом примере.
для начала В ОБЯЗ лезем в настройки проекта и прописываем пути для статики и для темплейтов
добавляем путь к темплейтам в словаре TEMPLATES к ключу DIRS': [os.path.join(BASE_DIR, 'application_in_question', 'templates')],
как показано ниже
# settings.py TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [os.path.join(BASE_DIR, 'application_in_question', 'templates')], 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', ], }, }, ] |
# settings.py TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [os.path.join(BASE_DIR, 'application_in_question', 'templates')], 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', ], }, }, ]
поясняю BASE_DIR - корневая дирректория.
application_in_question - папка приложения.
templates - в папке приложения создаём папку с именем 'templates' и в неё кладём наши .HTML шаблоны.
так же в настройках пропичываем статику:
# settings.py STATIC_URL = 'static/' STATICFILES_DIRS = [ os.path.join(BASE_DIR, 'static'), ] STATIC_ROOT = 'STATIC_ROOT/static/' |
# settings.py STATIC_URL = 'static/' STATICFILES_DIRS = [ os.path.join(BASE_DIR, 'static'), ] STATIC_ROOT = 'STATIC_ROOT/static/'
в этом случае в корневой папке создаём папку 'static'
в папке статик будут лежать наши CSS ( файлы стилей ), скрипты JS, фавиконы и т.п.
для того чтобы дёргать статику нам в HTML нужно сверху в начале прописать {% load static %}, это можно сделать единоразово в базовом шаблоне HTML.( про базовые шаблоны смотреть триллион видео на youtube ).
папку STATIC_ROOT создавать не нужно, она создастся когда введёшь команду python manage.py collectstatic
это нужно чтобы вся статика работала уже в общедоступной сети.(для локальной это не надо, но лучше делать, чтобы не забывать об этом никогда)
если на сайте будет медиа типа фоток или видео, а я думаю будет, то В ОБЯЗ прописываем в настройках:
MEDIA_URL = '/media/' MEDIA_ROOT = os.path.join(BASE_DIR, 'media') |
MEDIA_URL = '/media/' MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
настройки проекта самое важное в начале построения приложения, без этого работать ничего не будет.
так же когда будешь запускать в общюю сеть, то столкнёшся с тем что медиа не грузит. Обо этом я написал тут:
https://ru.stackoverflow.com/questions/1074512/dja...
.создаём нужную модель:
# models.py class Violation(models.Model): rules = models.TextField('Правила') consequences = models.TextField('Последствия нарушения') def __str__(self): return self.rules class Meta: verbose_name = 'Нарушение' verbose_name_plural = 'Нарушения' |
# models.py class Violation(models.Model): rules = models.TextField('Правила') consequences = models.TextField('Последствия нарушения') def __str__(self): return self.rules class Meta: verbose_name = 'Нарушение' verbose_name_plural = 'Нарушения'
потом проводим миграции в терминале:
python manage.py makemigrations
миграции требуются, чтобы джанго создал нужную "сетку" в базе данных, чтобы потом туда созранять данные.
после чего создаём обьекты модели или в панели администратора или через команду в пайтон:
Violation.objects.create(title=title, violations=violations) |
Violation.objects.create(title=title, violations=violations)
объекты будут хранится в базе данных.
в представлении, где мы рендерим страницу, получаем все объекты модели Violation из базы данных и формируем словарь "context " в который передаём ключи с полученными обьектами.(в данном случае передаём объект violations': violations)
# views .py
def rules(request): # Получаем все объекты модели Violation из базы данных violations = Violation.objects.all() # Передаем объекты модели в контекст шаблона context = { 'title': 'rules', 'violations': violations, } return render(request, 'main/rules.html', context) |
def rules(request): # Получаем все объекты модели Violation из базы данных violations = Violation.objects.all() # Передаем объекты модели в контекст шаблона context = { 'title': 'rules', 'violations': violations, } return render(request, 'main/rules.html', context)
чтобы переданные объекты обработать в HTML в джанго предусмотрены шаблонные переменные в формате {{ }}
смотрим наш HTML который будет рендерить джанго:
{% extends 'application_in_question/base.html' %} {% block title %} {{ title }} {% endblock %} {% block content %} <div class="light_pink_font_color"> <h1><b>Правила и наказания</b></h1> </div> <div> <table class="custom_table"> <thead> <tr> <th><b>Правила</b></th> <th><b>Наказания</b></th> </tr> </thead> <tbody> {% for violation in violations %} <tr> <td>{{ violation.rules }}</td> <td><b>{{ violation.consequences }}</b></td> </tr> {% endfor %} </tbody> </table> </div> {% endblock %} |
{% extends 'application_in_question/base.html' %} {% block title %} {{ title }} {% endblock %} {% block content %} <div class="light_pink_font_color"> <h1><b>Правила и наказания</b></h1> </div> <div> <table class="custom_table"> <thead> <tr> <th><b>Правила</b></th> <th><b>Наказания</b></th> </tr> </thead> <tbody> {% for violation in violations %} <tr> <td>{{ violation.rules }}</td> <td><b>{{ violation.consequences }}</b></td> </tr> {% endfor %} </tbody> </table> </div> {% endblock %}
тут мы видим наш тайтл {{ title }} и цикл for в котором перебираем "предметы" всех обьектов {{ violations }}
{% for violation in violations %} <tr> <td>{{ violation.rules }}</td> <td><b>{{ violation.consequences }}</b></td> </tr> {% endfor %} |
{% for violation in violations %} <tr> <td>{{ violation.rules }}</td> <td><b>{{ violation.consequences }}</b></td> </tr> {% endfor %}
- тут не указал ссылку на представление, но я думаю это в представлении не нуждается,
- RyanovskY, а почитай сначала сообщение об ошибке, ТС не осилил указать правильный путь до шаблонов, как в настройках, так и в CBV, а не то что он в указал в заголовке.
- Everything_is_bad, цитата """Да. сайт открывается но без данных из базы. """
там вообще какая-то мешанина даже без вьюхи, зато с командами терминала, потому не заметил.
вопрос поставлен конкретно про выгрузку обьектов базы на страницу, которая видимо даже открывается. - настройки дополнил, надеюсь помогло.
- RyanovskY, зачем эта дополнительная папка 'application_in_question', а если у тебя несколько app? И для templates в app не нужно DIRS править, он вообще для уровня project. Ну и уже давно в django завезли pathlib, выбрасывай os.path.join, делай просто BASE_DIR / 'media'
- Everything_is_bad, application_in_question это и есть app, templates в папке апп, чтобы явно разграничивать темплейты одного приложения от темплейтов другого. а так же в templates можно создавать папки, чтобы явно разграничивать разделы сайта с его множеством html типа папка "чаты" с шаблонами для чатов, папка "новости" с шаблонами для новостей.
app это папки (насекундочку)
так и написано приложение из задачи.это моё мнение, может я ещё не дорос до понимающего, а в инете на котором я обучаюсь вероятнее всего один мусор
- RyanovskY, ты app и project не путаешь? project он один, app много, ты явно в DIRS указал templates одного app, также будешь про каждый app указывать? хотя это не требует, оно автоматически так делает, DIRS это про папку шаблонов не привязанных к app, а уникальны на уровне project. Ну и нафига ты про статику начал рассказывать, когда у ТС с этим пока нет проблем
- Everything_is_bad, я в dirs же настроил не templates
- Everything_is_bad, я укащывал путь не на templates. Потому чтт директория по другому назыается
- David It, dirs хочет путь до шаблонов, но ты ему фигну подсовываешь
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Для загрузки данных из базы данных в HTML страницу, вам необходимо использовать язык программирования, который будет взаимодействовать с базой данных и динамически формировать HTML код на основе полученных данных. В случае использования PHP, например, вы можете использовать следующий подход:
1. Установите соединение с базой данных. Для этого используйте функцию mysqli_connect() или PDO.
2. Выполните SQL запрос к базе данных для извлечения необходимых данных. Например, если вам нужно получить список пользователей, вы можете использовать запрос типа SELECT * FROM users.
3. Обработайте результат запроса и выведите данные на HTML страницу. Для этого можно использовать циклы, условия и другие конструкции языка PHP.
Пример кода на PHP:
<?php // Устанавливаем соединение с базой данных $connection = mysqli_connect('хост', 'пользователь', 'пароль', 'название_базы_данных'); // Проверяем соединение if (!$connection) { die('Ошибка подключения к базе данных: ' . mysqli_connect_error()); } // Выполняем SQL запрос $query = "SELECT * FROM users"; $result = mysqli_query($connection, $query); // Перебираем результат и выводим данные на HTML страницу echo '<ul>'; while ($row = mysqli_fetch_assoc($result)) { echo '<li>' . $row['username'] . '</li>'; } echo '</ul>'; // Закрываем соединение mysqli_close($connection); ?>
Этот код подключается к базе данных, извлекает список пользователей и выводит их имена в виде списка на HTML странице. Помните, что для безопасности важно использовать подготовленные запросы или другие методы защиты от SQL инъекций.