Форум программистов, компьютерный форум, киберфорум
Python: Django
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/103: Рейтинг темы: голосов - 103, средняя оценка - 4.85
2 / 2 / 1
Регистрация: 05.03.2015
Сообщений: 191

Вывод информации из таблицы базы данных на страницу

19.11.2018, 15:49. Показов 19810. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!
Пишу такую программу: есть база данных с набором из нескольких таблиц. На страницу сайта выводится одна из таблиц в элемент <table></table>. В первом столбце таблицы приведены названия установок, в других столбцах приведена информация об установках. У меня не получается реализовать возможность того, что бы при нажатии на какую либо из установок из первого столбца открывалась страница с информацией об этой установке. Приведу имеющийся у меня код:
Файл urls.py:
Python
1
2
3
4
5
6
7
8
9
from django.conf.urls import url
from . import views
#from .views import List
 
urlpatterns = [
    #url(r'^$', views.home_page),
    url(r'^$', views.List.as_view()),
    url(r'^i-2/16-11-2018/$', views.DisturbResearchInstallationInfo),
]
Файл models.py:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
from django.db import models
# Create your models here.
class Company(models.Model):
    name_company       = models.CharField(max_length=500, verbose_name = "Название организации")
    name_company_short = models.CharField(max_length=100, verbose_name = "Сокращенное название организации")
    info_company       = models.TextField(max_length=5000, verbose_name = "Информация об организации")
 
    def __str__(self):
        return self.name_company_short
 
    class Meta:
        verbose_name = 'Название организации'
        verbose_name_plural= 'Названия организаций'
 
class NameRI(models.Model):
    name_ri    = models.CharField(max_length=500, verbose_name = "Название")
    company_ri = models.ForeignKey(Company, on_delete=models.CASCADE, verbose_name = "Название организации")
    info_ri    = models.TextField(max_length=5000, verbose_name = "Информация")
 
    def __str__(self):
        return self.name_ri
 
    class Meta:
        verbose_name = 'Название'
        verbose_name_plural= 'Названия'
 
class DisturbRI(models.Model):
    name_ri                  = models.ForeignKey(NameRI, on_delete=models.CASCADE, verbose_name = "Название установки")
    company_ri               = models.ForeignKey(Company, on_delete=models.CASCADE, verbose_name = "Название организации")
    data_disturb             = models.DateField(auto_now=False, auto_now_add=False, verbose_name = "Дата")
    time_disturb             = models.TimeField(verbose_name = "Время")
    name_disturb             = models.CharField(max_length=500, verbose_name = "Название нарушения")
    file_disturb             = models.FileField(max_length=500, verbose_name = "Файл отчета")
 
    def __str__(self):
        return u'%s' % (self.name_ri)
 
    class Meta:
        ordering = ('-data_disturb', )
        verbose_name = 'Нарушение в работе'
        verbose_name_plural= 'Нарушения в работе'
Файл views.py:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
from django.shortcuts import render
from django.views.generic import TemplateView
from django.http import HttpResponse
from .models import DisturbRI
 
# Create your views here.
 
class List(TemplateView):
    template_name = 'home_page.html'
    def get(self, request):
        all_disturbRI = DisturbRI.objects.all().order_by('-data_disturb')
 
        context = {
            'all_disturbRI' : all_disturbRI,
        }
        return render(request, self.template_name, context)
 
    def post(self, request):
        query = request.POST['search']
        search_list = DisturbRI.objects.filter(name_ri__name_ri=query)
        if search_list.count() != 0:
            context = {
                'search_list' : search_list,
                'query' : query,
            }
        else:
            context = {
                'empty' : "Ничего не найдено. Ошибка в запросе",
                'query' : query,
            }
        return render(request, 'search_result.html', context)
def DisturbResearchInstallationInfo(request):
 
    return render(request, 'disturb_ri_info.html', )
Файл html-я:
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>{% block title %}Нарушения на установках{% endblock %}</title>
</head>
<body>
<header>
    <nav>
        <a href="">Домашняя страница</a>
        <a href="/admin">Администрирование</a>
    </nav>
</header>
{% include 'aside.html'%}
 
{% block content %}
 
<h1>Нарушения на установках</h1>
 
<h2>Форма поиска</h2>
 
<form action="" method="post">
    {% csrf_token %}
    <label for="">Введите название</label>
    <input name="search" type="text">
    <button type="submit">Найти</button>
</form>
 
<table border="1" cellpadding="2px" align="center">
    <tr style="background : blue; color : white;">
        <td>Название установки</td>
        <td>Тип</td>
        <td>Дата нарушения</td>
        <td>Название нарушения</td>
    </tr>
    {% for disturbRI in all_disturbRI %}
    <tr>
        <td>
            <a href="/i-2/16-11-2018">{{disturbRI.name_ri}}</a>
        </td>
        <td>{{disturbRI.type_ri}}</td>
        <td>{{disturbRI.data_disturb}}</td>
        <td>{{disturbRI.name_disturb}}</td>
    </tr>
    {% endfor %}
</table>
 
 
{% endblock %}
 
<footer>
    Текст....
</footer>
</body>
</html>
Вообщем у меня не получается, что бы при нажатии на любую из установок из из первого столбца на следующей странице отображалась инфа именно к этой установке.
Буду очень признателен за помощь!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
19.11.2018, 15:49
Ответы с готовыми решениями:

Как вывод информации из базы данных MySql на веб страницу
Добрый день. Нужно есть форма, по запросу номера и кода, должен выводить определенную информацию или картинку, под данной формой Как...

Получение информации из базы данных и передача этой информации через массив на другую страницу
Здравствуйте! У меня возникла проблема при передачи массива на другую страницу. Массив я получаю из базы данных. Ниже приведен код, который...

Базы данных. Поиск и вывод информации из базы.
Вопрос к уважаемым знатокам в работе в ИСР Delphi. Имеется простая база данных(поле1-название\поле2-параметр), созданная в MS Access...

19
 Аватар для IRIP
514 / 146 / 28
Регистрация: 18.04.2015
Сообщений: 1,904
Записей в блоге: 16
19.11.2018, 17:17
вообще, на сколько я знаю, в джанго есть генератор - который сам модели рисует по готовой схеме базы данных
0
2 / 2 / 1
Регистрация: 05.03.2015
Сообщений: 191
19.11.2018, 19:14  [ТС]
Базу данных я из админ панели создал и наполнил. Я вывожу таблицу базы данных на страничку сайта через тег <table> и при нажатии на любой из элементов первого столбца (т.е. нажав на любую из "установок") я бы хотел открыть новую страничку с инфой по этой установке (в этом у меня проблема).
0
102 / 75 / 38
Регистрация: 08.11.2017
Сообщений: 272
19.11.2018, 21:57
А в чём собственно проблема?

Добавлено через 24 минуты
urls.py

Python
1
2
3
...
 path('disturb/<int:id>/', DisturbResearchInstallationInfo, name='disturb_detail_url'),
...
models.py

Python
1
2
3
4
5
...
 
    def get_absolute_url(self):
        return reverse('disturb_detail_url', kwargs={'id': self.pk})
....
views.py

Python
1
2
3
4
5
...
def DisturbResearchInstallationInfo(request, id):
    disturb_info = get_object_or_404(DisturbRI, pk=id)
    return render(request, 'disturb_ri_info.html', context={'disturb_info': disturb_info})    # шаблон disturb_ri_info.html делайте там будет инфа по конкретному объекту.
...
home_page.html
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
...
<table border="1" cellpadding="2px" align="center">
    <tr style="background : blue; color : white;">
        <td>Название установки</td>
        <td>Тип</td>
        <td>Дата нарушения</td>
        <td>Название нарушения</td>
    </tr>
    {% for disturbRI in all_disturbRI %}
    <tr>
        <td>
             <a href="{{ disturbRI.get_absolute_url }}"> {{disturbRI.name_ri}}</a>
 
        </td>
        <td>{{disturbRI.type_ri}}</td>
        <td>{{disturbRI.data_disturb}}</td>
        <td>{{disturbRI.name_disturb}}</td>
    </tr>
    {% endfor %}
...
</table>



Написал на скорую руку, возможны ошибки и т.д. проект собирать лень, называете хотя бы функции правильно, почитайте PEP8.
2
2 / 2 / 1
Регистрация: 05.03.2015
Сообщений: 191
22.11.2018, 12:52  [ТС]
Спасибо все работает как надо.
Можно еще вопрос.
У меня в классе DisturbRI есть сохранение файла, который сохраняется в папке с названием установки (т.е. name_ri) и следующей подпапке с датой происшествия (т.е. data_disturb).
Файл models.py:
Python
1
2
3
4
5
6
7
8
9
10
def get_upload_path(instance, filename): # определение пути к файлу
    return os.path.join("disturb_ri/%s" % instance.slug_name_ri, "%s" % instance.data_disturb.isoformat(), filename)
 
class DisturbRI(models.Model):
    name_ri                  = models.ForeignKey(NameRI, on_delete=models.CASCADE, verbose_name = "Название установки")
    company_ri               = models.ForeignKey(Company, on_delete=models.CASCADE, verbose_name = "Название организации")
    data_disturb             = models.DateField(auto_now=False, auto_now_add=False, verbose_name = "Дата")
    time_disturb             = models.TimeField(verbose_name = "Время")
    name_disturb             = models.CharField(max_length=500, verbose_name = "Название нарушения")
    file_disturb             = models.FileField(max_length=500, upload_to=get_upload_path, verbose_name = "Файл отчета")
В файле settings.py установлено:
Python
1
2
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'
Проблема такая, что когда вывожу информацию о происшествии на конкретной установке на отдельную страничку (т.е. через шаблон disturb_ri_info.html) я не могу отправить туда нужный именно к этому нарушению pdf файл из папки с каким-либо путем (путь формируется в функции get_upload_path).
0
102 / 75 / 38
Регистрация: 08.11.2017
Сообщений: 272
22.11.2018, 13:08
Не много не понял, у вас в disturb_ri_info.html выводятся все поля из модели в том числе и ссылка на файл? в бд у вас что хранится, ссылка на файл ? Вам надо дать возможность скачать ранее загруженный файл?
0
2 / 2 / 1
Регистрация: 05.03.2015
Сообщений: 191
22.11.2018, 13:14  [ТС]
disturb_ri_info.htm выглядит примерно так:
HTML5
1
2
3
4
5
6
7
{% block content %}
<h2>Отчет о нарушении в работе установки</h2>
<p>{{disturb_info.name_ri}}</p>
<p>{{disturb_info.data_disturb}}</p>
<p>{{disturb_info.name_disturb}}</p>
<embed src="/media/disturb_ri/{{disturb_info.name_ri}}/{{disturb_info.data_disturb}}/ type="application/pdf" width="600" height="400" />
{% endblock %}
В тег embed у меня не выходит вывести нужный pdf файл.
0
2 / 2 / 1
Регистрация: 05.03.2015
Сообщений: 191
28.11.2018, 23:30  [ТС]
Ребята, ни кто помочь не может? К сожалению я все еще не разобрался этой проблемой..
0
102 / 75 / 38
Регистрация: 08.11.2017
Сообщений: 272
29.11.2018, 20:56
Я бы помог, да так и не понял что требуется.
Мне видится тут проблемы, с хранением файлов и УРЛами до них. Сделайте один путь до файлов которые юзер загружает например /user_media, в настройках проекта вам нужены MEDIA ROOT, затем в urls надо добавить поддержку раздачи статики из MEDIA ROOT, а в шаблонах <embed src="{{disturb_info.file}} будет примерно так.
0
2 / 2 / 1
Регистрация: 05.03.2015
Сообщений: 191
30.11.2018, 11:04  [ТС]
Давайте еще раз расскажу что у меня происходит и что не получается. Есть база данных в которой хранится информация об "установках" - это таблица DisturbRI. В качестве установки можно понимать например фрезерный станок. На каждой из установок за время эксплуатации происходят нарушения и по этим нарушениям составляются отчеты с описанием произошедшего события. На главную страницу сайта я вывожу таблицу с наименованиями "установок", датой нарушения, названием нарушения, классификацией нарушения и т.п... Нажимая в таблице на какую либо из записей (например нажимаю на надпись "установка 6") перехожу на следующую страницу с информацией об нарушении на данной установке (НО важно заметить, что за время эксплуатации на этой установке может быть много нарушений). И вот на этой странице у меня не получается отобразить pdf файл, относящийся именно к этой установке и именно этому нарушению.
В моделе в поле
Python
1
file_disturb = models.FileField(max_length=500, verbose_name = "Файл отчета")
у меня загружаются непосредственно сами pdf файлы отчетов. Так же в файле models.py создал функцию:
Python
1
2
def get_upload_path(instance, filename): # определение пути к файлу
    return os.path.join("disturb_ri/%s" % instance.name_ri, "%s" % instance.data_disturb.isoformat(), filename)
которая в папке media создает подпапку disturb_ri, далее подпапки названий установок. В папках названий установок есть подпапки дат нарушений. И уже в этих последних папках лежат непосредственно сами пдфки отчетов о нарушениях.
0
102 / 75 / 38
Регистрация: 08.11.2017
Сообщений: 272
30.11.2018, 11:33
Попробуйте сделать сначала без папок и подпапок, если работает тогда уже дальше с путями колдуйте. А обязательно держать эти пдфки по подпапкам?
0
2 / 2 / 1
Регистрация: 05.03.2015
Сообщений: 191
30.11.2018, 12:00  [ТС]
Да, эти подпапки я бы хотел создавать, а не смешивать все отчеты по разным установкам и датам нарушений в одной папки. Т.к. есть такие ситуации: "установка n" и у нее за много дат много нарушений. И что бы не смешивать это все да и еще с другими установками, мне кажется, что лучше распределить это все по подпапкам.
Кстати в функции:
Python
1
2
3
4
5
def DisturbResearchInstallationInfo(request, id):
    disturb_info = get_object_or_404(DisturbRI, pk=id)
    print("Название установки:      " + disturb_info.name_ri)
    print("Путь к файлу с отчетом: " + str(disturb_info.file_disturb))
    return render(request, 'disturb_ri_info.html', context={'disturb_info': disturb_info})
Принт, который выводит путь к файлу показывает верный путь (например: distudb_ri/facility109/2003-08-28/Акт о расследовании нарушения.pdf)! Но в шаблоне строка
HTML5
1
<embed src="{{disturb_info.file_disturb}}" type="application/pdf" width="600" height="400" />
не позволяет отобразить этот пдф...
0
102 / 75 / 38
Регистрация: 08.11.2017
Сообщений: 272
30.11.2018, 12:02
А скачать позволит?

HTML5
1
<a href="{{disturb_info.file_disturb}}">PDF </a>
0
2 / 2 / 1
Регистрация: 05.03.2015
Сообщений: 191
30.11.2018, 12:09  [ТС]
Нет, не позволяет. Вываливается ошибка "Page not found (404)". Но ведь у него же не создан соответствующий юрл?! И вьюшки нет нужной? или я чтото не понимаю.
Кстати в консоли после того как выводится два сообщения:
Python
1
2
    print("Название установки:      " + disturb_info.name_ri)
    print("Путь к файлу с отчетом: " + str(disturb_info.file_disturb))
далее выводится сообщение: Not Found: и далее полностью правильный путь (равный disturb_info.file_disturb) в искомому файлу..
0
102 / 75 / 38
Регистрация: 08.11.2017
Сообщений: 272
30.11.2018, 12:11
А в url проекта добавили путь на раздачу media ?
0
2 / 2 / 1
Регистрация: 05.03.2015
Сообщений: 191
30.11.2018, 12:16  [ТС]
Нет, не добавил. Не совсем понимаю, как это сделать.. Надо и в файле views.py что то править?
В settings.py такие настройки:
Python
1
2
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'
0
102 / 75 / 38
Регистрация: 08.11.2017
Сообщений: 272
30.11.2018, 12:17
urls.py проекта, а не приложения

Python
1
2
3
4
5
6
urlpatterns = [
    ...
    ...
    ...
 
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
если не заработает, кидайте ссылку на репу, ковырну.
0
2 / 2 / 1
Регистрация: 05.03.2015
Сообщений: 191
30.11.2018, 13:03  [ТС]
Нет, тоже не заработало..

Добавлено через 30 минут
Вообще странно, тег:
HTML5
1
<a href="{{disturb_info.file_disturb}}">PDF </a>
показывает частично правильный путь. Он показывает такую адресную строку: http://127.0.0.1:8000/disturb/... 0%A0-2.pdf, где вместо этой абракадабры должно быть русскоязычное название фала. Т.е. получается что он не идет правильным путем к файлу.
Хотя если в адресной строке прописать так:
http://127.0.0.1:8000/media/di... 0%A0-2.pdf, то файл откроется.
0
102 / 75 / 38
Регистрация: 08.11.2017
Сообщений: 272
30.11.2018, 13:10
Попробуйте так

HTML5
1
<a href="{{disturb_info.file_disturb.url}}">PDF </a>
url на конце или path

и вообще почитайте доку, там всё расписано.
0
2 / 2 / 1
Регистрация: 05.03.2015
Сообщений: 191
30.11.2018, 14:20  [ТС]
Спасибо! Заработало в полной мере!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
30.11.2018, 14:20
Помогаю со студенческими работами здесь

Вывод на страницу из базы данных
Здравствуйте! Уже несколько часов бьюсь с этим делом - ничего не получается. Есть такой экшн: public ActionResult Index() ...

Добавление данных в таблицы базы через php страницу
Есть база данных, как через сайт сделать заполнение таблиц таким образом, чтобы в, например, дроп дауне выбирать столбец необходимой...

Вывод данных из базы на сгенерированную страницу
Всем привет. Подскажите пожалуйста. Уже неделю бьюсь с этим У меня есть на пхп написан личный кабинет учета клиентов. Есть все, что...

Вывод данных в JSP-страницу из базы
Пытаюсь создать веб-страницу с выводом на экран списка со значениями из базы. Сама страница выходит без ошибки, но пустая... Скрипт ...

Вывод информации из базы данных
здравствуйте. есть форма для добавления информации в БД. &lt;form method=&quot;post&quot;&gt; &lt;b&gt;name&lt;/b&gt;&lt;br&gt; &lt;input...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru