Дисциплины
Лекции
Комментарии
Заявки
Расписание
Главная
Контактная информация
Лекции
Конкретная лекция
Расписание
Шаблоны страниц для отображения ошибок (ошибки доступа,
ошибки адресации и т.д.)
Основы:
Модель Дисциплина:
class Discipline(models.Model):
name = models.CharField('Название дисциплины', max_length=50)
class Meta:
verbose_name = "Дисциплина"
verbose_name_plural = 'Дисциплины'
def __str__(self):
return self.name
Рассмотрим отдельные элементы на примерах следующих моделей:
class Discipline(models.Model)
class Meta:
verbose_name = "Дисциплина"
verbose_name_plural = 'Дисциплины'
def __str__(self):
return self.name
Модель Лекция
class Lecture(models.Model):
discipline = models.ForeignKey(Discipline,on_delete=models.CASCADE,null=True)
title = models.CharField('Название лекции', max_length=150)
text = models.TextField('Текст лекции')
date = models.DateField('Дата публикации',auto_now=True)
class Meta:
verbose_name = 'Лекция'
verbose_name_plural = 'Лекции'
def __str__(self):
return self.title
В данной модели представлено несколько новых полей. Прежде всего,
это внешний ключ от модели Дисциплина. При его объявлении добавляется
несколько важных атрибутов – прежде всего on_delete, который описывает
поведение записей при удалении оригинального ключа. В данном случае, при
удалении определенного ключа, удаляются и все связанные с ним записи.
Также, здесь добавляется атрибут null, положительное значение которого
позволяет сохранять записи вообще без внешнего ключа.
Еще одним новым полем является поле date, которое хранит время
публикации. Атрибут auto_now позволяет проставлять дату автоматически.
Модель Комментарий
class Comment(models.Model):
lecture = models.ForeignKey(Lecture, on_delete=models.CASCADE)
autor_name = models.CharField('Имя автора', max_length=50)
comment_text = models.TextField('Текст комментария')
class Meta:
verbose_name = 'Комментарий'
verbose_name_plural = 'Комментарии'
def __str__(self):
return self.comment_text
Модель Расписание
class Shelude(models.Model):
Group = models.ForeignKey(Group,on_delete=models.PROTECT, null=True)
Day = models.ForeignKey(Day, on_delete=models.PROTECT, null=True)
first_lect = models.ForeignKey(Discipline, on_delete=models.PROTECT, related_name= 'first_lect',
verbose_name='Первая пара', blank=True, null=True)
second_lect = models.ForeignKey(Discipline, on_delete=models.PROTECT, related_name='second_lect',
verbose_name='Вторая пара', blank=True, null=True)
thrid_lect = models.ForeignKey(Discipline, on_delete=models.PROTECT, related_name='thrid_lect',
verbose_name='Третья пара', blank=True, null=True)
four_lect = models.ForeignKey(Discipline, on_delete=models.PROTECT, related_name='four_lect',
verbose_name='Четвертая пара', blank=True, null=True)
five_lect = models.ForeignKey(Discipline, on_delete=models.PROTECT, related_name='five_lect',
verbose_name='Пятая пара', blank=True,null=True)
def __str__(self):
return self.Group.group_num
class Meta:
verbose_name = 'Расписание'
verbose_name_plural = 'Расписания'
unique_together = ('Group', 'Day')
В данной модели присутствует несколько внешних ключей к одной
таблице. Это допустимый случай – во время миграции API автоматически
преобразовывает их в допустимые и автоматически обрабатывает запросы к
ним.
manage.py makemigrations
manage.py migrate
def index(request):
return render(request, 'main/index.html')
def about(request):
return render(request, 'main/about.html')
Также, помимо простого отображения страницы, представления могут
передавать данные из базы данных. Поскольку Django представлен с учетом
концепции MVC (Model-View-Controller/ модель-представление-контроллер),
при обращении к базе данных нет необходимости писать sql-запрос,
достаточно обратится к ее модели. Рассмотрим представление, выводящее на
страницу конкретную статью:
lect = Lecture.objects.get(id=lecture_id)
def shelude(request):
grp = Group.objects.first()
group_id = grp.idgroup_id = 1
if request.method == "POST":
group = groupForm(request.POST)
if group.is_valid():
group_id = request.POST.get('group')
print(group)
group = groupForm()
forms = {
'group':group
}
group = Group.objects.get(id=group_id)
pn = Shelude.objects.filter(Group=group_id, Day=1)
vt = Shelude.objects.filter(Group=group_id, Day=2)
sr = Shelude.objects.filter(Group=group_id, Day=3)
ch = Shelude.objects.filter(Group=group_id, Day=4)
pt = Shelude.objects.filter(Group=group_id, Day=5)
return render(request, 'main/shelide.html',{'pon':pn,'vt':vt,'sr':sr,'chet':ch,'pt':pt, 'forms':forms,'group':group})
По умолчанию выводиться расписание для первой группы в базе:
grp = Group.objects.first()
group_id = grp.idgroup_id = 1
Однако, если к представлению обращаются при помощи метода POST,
вызываемого срабатыванием формы и заполненная форма верна, то
полученные из нее данные подставляются в фильтр:
if request.method == "POST":
if group.is_valid():
group_id = request.POST.get('group')
***
group = Group.objects.get(id=group_id)
pn = Shelude.objects.filter(Group=group_id, Day=1)
***
def lections(request):
Lectures = Lecture.objects.all()
Disciplines = Discipline.objects.all()
paginator = Paginator(Lectures,2)
page_num = request.GET.get('page',1)
page_objects = paginator.get_page(page_num)
Seach = seachForm()
forms = {
'Seach': Seach,
Lectures = Lecture.objects.all()
paginator = Paginator(Lectures,2)
После этого при помощи GET-запроса получается номер страницы и на
основе этого номера выбирается список строк.
page_num = request.GET.get('page',1)
page_objects = paginator.get_page(page_num)
def categories(request,discioline_id):
Disciplines = Discipline.objects.all()
Lectures = Lecture.objects.all().filter(discipline = discioline_id)
Discipline_name = Discipline.objects.get(id=discioline_id)
paginator = Paginator(Lectures, 2)
page_num = request.GET.get('page', 1)
page_objects = paginator.get_page(page_num)
def seach(request):
Lectures = Lecture.objects.all()
Disciplines = Discipline.objects.all()
error = ''
lectures = ''
seach_q = '2'
if request.method == "POST":
Seach = seachForm(request.POST)
if Seach.is_valid():
seach_q = request.POST.get('seach')
print(seach_q)
Lectures = Lecture.objects.filter(title__icontains=seach_q)
paginator = Paginator(Lectures, 2)
page_num = request.GET.get('page', 1)
page_objects = paginator.get_page(page_num)
Seach = seachForm()
forms = {
'Seach': Seach,
}
return render(request,'main/lectures.html',{ 'forms':forms,'Seach_q': seach_q,
'letc':lectures,'Seach':Seach,'page_obj':page_objects})
Рассмотрим создание ша
<!DOCTYPE html>
{% load static %}
<html lang="en">
<head>
<meta charset="UTF-8">
<title> {% block Title %}{% endblock %}</title>
<link rel="stylesheet" href="{% static "css/main.css" %}" />
</head>
<body>
<header>
<div class="top-menu">
<ul >
<li><a href="{% url 'main:home' %}">Главная</a></li>
<li><a href="{% url 'main:lections' %}">Лекции</a></li>
<li><a href="{% url 'main:shelude' %}">Расписание</a></li>
<li><a href="{% url 'main:about' %}">Контакты</a></li>
</ul>
</div>
</header>
<div class="falsh"></div>
<div class="content">
{% block Content %}{% endblock %}
</div>
<footer class="footer">1</footer>
</body>
</html>