Как загрузить данные в html из базы данных?

Ссылка скопирована
1 ответ

Привет. Есть у меня домашний проект, в нем развернут 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 хотят искать шаблоны, да даже в ошибке тебе про это пишут

  • Everything_is_bad, как раз это david138it' и указал заместо teplates, потому что папка так и называетсч
  • Everything_is_bad, content list гле еще нужно укащать?
  • David It, а разберись для начала на что указывает BASE_DIR, а то в итоге получается что ты папку с шаблонами внезапно назвал david138it
  • покажу на своём простом примере.

    для начала В ОБЯЗ лезем в настройки проекта и прописываем пути для статики и для темплейтов

    добавляем путь к темплейтам в словаре 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 хочет путь до шаблонов, но ты ему фигну подсовываешь
    Нужно решить такую задачу?

    Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

    Заказать помощь
    Лучший ответ
    1
    Виктор Sys Ответ

    Для загрузки данных из базы данных в 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 &#039;<ul>';
    while ($row = mysqli_fetch_assoc($result)) {
        echo '<li>' . $row['username'] . '</li>';
    }
    echo '</ul>';
     
    // Закрываем соединение
    mysqli_close($connection);
    ?&gt;

    &lt;?php // Устанавливаем соединение с базой данных $connection = mysqli_connect(&#039;хост&#039;, &#039;пользователь&#039;, &#039;пароль&#039;, &#039;название_базы_данных&#039;); // Проверяем соединение if (!$connection) { die(&#039;Ошибка подключения к базе данных: &#039; . mysqli_connect_error()); } // Выполняем SQL запрос $query = &quot;SELECT * FROM users&quot;; $result = mysqli_query($connection, $query); // Перебираем результат и выводим данные на HTML страницу echo &#039;<ul>'; while ($row = mysqli_fetch_assoc($result)) { echo '<li>' . $row['username'] . '</li>'; } echo '</ul>'; // Закрываем соединение mysqli_close($connection); ?&gt;

    Этот код подключается к базе данных, извлекает список пользователей и выводит их имена в виде списка на HTML странице. Помните, что для безопасности важно использовать подготовленные запросы или другие методы защиты от SQL инъекций.

    Другие ответы (0)

    Пока нет других ответов. Будьте первым, кто поможет автору.

    Ответить на вопрос

    комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    Вам также может быть интересно