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

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

19.11.2018, 15:49. Показов 19889. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru