-
-
Сияние
-
Автор: Стивен Кинг
-
Дата публикации: 2018-09-10
-
-
-
1984
-
Автор: Джордж Оруэл
-
Дата публикации: 2015-03-11
+
+
+ {% for book in books %}
+
+
{{ book.name }}
+
Автор: {{ book.author }}
+
Дата публикации: {{ book.pub_date }}
+ {% endfor %}
{% endblock %}
\ No newline at end of file
diff --git a/2.1-databases/models_list_displaying/templates/books/books_pagi.html b/2.1-databases/models_list_displaying/templates/books/books_pagi.html
new file mode 100644
index 000000000..fa9ea2d7d
--- /dev/null
+++ b/2.1-databases/models_list_displaying/templates/books/books_pagi.html
@@ -0,0 +1,31 @@
+
+
+
+
+
Title
+
+
+
+
+
+ {% for book in books %}
+
+
{{ book.name }}
+
Автор: {{ book.author }}
+
Дата публикации: {{ book.pub_date }}
+
+ {% endfor %}
+
+
+
+ {% if page.has_previous %}
+
< {{ previous_page }}
+ {% endif %}
+
+ {% if page.has_next %}
+
{{ next_page }} >
+ {% endif %}
+
+
\ No newline at end of file
diff --git a/2.1-databases/work_with_database/main/settings.py b/2.1-databases/work_with_database/main/settings.py
index 7a57a4ceb..6374cd683 100644
--- a/2.1-databases/work_with_database/main/settings.py
+++ b/2.1-databases/work_with_database/main/settings.py
@@ -55,7 +55,7 @@
'HOST': '127.0.0.1',
'PORT': '5432',
'USER': 'postgres',
- 'PASSWORD': 'ваш пароль',
+ 'PASSWORD': '1',
}
}
diff --git a/2.1-databases/work_with_database/phones/admin.py b/2.1-databases/work_with_database/phones/admin.py
index 8c38f3f3d..dcab2a211 100644
--- a/2.1-databases/work_with_database/phones/admin.py
+++ b/2.1-databases/work_with_database/phones/admin.py
@@ -1,3 +1,7 @@
from django.contrib import admin
+from .models import Phone
-# Register your models here.
+
+@admin.register(Phone)
+class PhoneAdmin(admin.ModelAdmin):
+ pass
diff --git a/2.1-databases/work_with_database/phones/management/commands/import_phones.py b/2.1-databases/work_with_database/phones/management/commands/import_phones.py
index be777c517..b17b4cdd5 100644
--- a/2.1-databases/work_with_database/phones/management/commands/import_phones.py
+++ b/2.1-databases/work_with_database/phones/management/commands/import_phones.py
@@ -14,4 +14,10 @@ def handle(self, *args, **options):
for phone in phones:
# TODO: Добавьте сохранение модели
- pass
+ Phone.objects.create(name=phone['name'],
+ price=phone['price'],
+ image=phone['image'],
+ release_date=phone['release_date'],
+ lte_exists=phone['lte_exists'],
+ slug='-'.join(phone['name'].split())
+ )
diff --git a/2.1-databases/work_with_database/phones/migrations/0001_initial.py b/2.1-databases/work_with_database/phones/migrations/0001_initial.py
new file mode 100644
index 000000000..1f48d02e0
--- /dev/null
+++ b/2.1-databases/work_with_database/phones/migrations/0001_initial.py
@@ -0,0 +1,26 @@
+# Generated by Django 4.0.6 on 2022-08-02 18:00
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ initial = True
+
+ dependencies = [
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='Phone',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('name', models.CharField(max_length=50)),
+ ('price', models.DecimalField(decimal_places=2, max_digits=9)),
+ ('image', models.ImageField(upload_to='')),
+ ('releaze_date', models.DateField()),
+ ('lte_exists', models.BooleanField()),
+ ('slug', models.SlugField(allow_unicode=True)),
+ ],
+ ),
+ ]
diff --git a/2.1-databases/work_with_database/phones/migrations/0002_rename_releaze_date_phone_release_date.py b/2.1-databases/work_with_database/phones/migrations/0002_rename_releaze_date_phone_release_date.py
new file mode 100644
index 000000000..6b66b6b7b
--- /dev/null
+++ b/2.1-databases/work_with_database/phones/migrations/0002_rename_releaze_date_phone_release_date.py
@@ -0,0 +1,18 @@
+# Generated by Django 4.0.6 on 2022-08-04 19:26
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('phones', '0001_initial'),
+ ]
+
+ operations = [
+ migrations.RenameField(
+ model_name='phone',
+ old_name='releaze_date',
+ new_name='release_date',
+ ),
+ ]
diff --git a/2.1-databases/work_with_database/phones/models.py b/2.1-databases/work_with_database/phones/models.py
index e79b3ba32..4fde983ed 100644
--- a/2.1-databases/work_with_database/phones/models.py
+++ b/2.1-databases/work_with_database/phones/models.py
@@ -2,5 +2,9 @@
class Phone(models.Model):
- # TODO: Добавьте требуемые поля
- pass
+ name = models.CharField(max_length=50)
+ price = models.DecimalField(max_digits=9, decimal_places=2)
+ image = models.ImageField()
+ release_date = models.DateField()
+ lte_exists = models.BooleanField()
+ slug = models.SlugField(allow_unicode=True)
diff --git a/2.1-databases/work_with_database/phones/views.py b/2.1-databases/work_with_database/phones/views.py
index afec3b5ec..bacd61aca 100644
--- a/2.1-databases/work_with_database/phones/views.py
+++ b/2.1-databases/work_with_database/phones/views.py
@@ -1,17 +1,30 @@
from django.shortcuts import render, redirect
+from phones.models import Phone
+
def index(request):
return redirect('catalog')
def show_catalog(request):
+ sort = request.GET.get('sort', None)
+ if sort == 'name':
+ phones = list(Phone.objects.all().order_by(sort))
+ elif sort == 'min_price':
+ phones = list(Phone.objects.all().order_by('price'))
+ elif sort == 'max_price':
+ phones = list(Phone.objects.all().order_by('-price'))
+ else:
+ phones = list(Phone.objects.all())
+ print(phones)
template = 'catalog.html'
- context = {}
+ context = {'phones': phones}
return render(request, template, context)
def show_product(request, slug):
template = 'product.html'
- context = {}
+ context = {'phone': Phone.objects.get(slug=slug)}
+ print(context['phone'])
return render(request, template, context)
diff --git a/2.1-databases/work_with_database/requirements.txt b/2.1-databases/work_with_database/requirements.txt
index f00395277..4106edc58 100644
--- a/2.1-databases/work_with_database/requirements.txt
+++ b/2.1-databases/work_with_database/requirements.txt
@@ -1,2 +1,5 @@
-django
-psycopg2-binary
+asgiref==3.5.2
+Django==4.0.6
+Pillow==9.2.0
+psycopg2-binary==2.9.3
+sqlparse==0.4.2
diff --git a/2.1-databases/work_with_database/templates/product.html b/2.1-databases/work_with_database/templates/product.html
index 4fe945507..616b51df1 100644
--- a/2.1-databases/work_with_database/templates/product.html
+++ b/2.1-databases/work_with_database/templates/product.html
@@ -19,4 +19,5 @@
{{ phone.name }}
Дата выпуска: {{ phone.release_date }}
LTE: {{ phone.lte_exists|yesno:'есть,нет' }}
+
{% endblock %}
diff --git a/2.2-databases-2/m2m-relations/articles.json b/2.2-databases-2/m2m-relations/articles.json
index e122dabdb..cee98ef78 100644
--- a/2.2-databases-2/m2m-relations/articles.json
+++ b/2.2-databases-2/m2m-relations/articles.json
@@ -28,5 +28,47 @@
"published_at": "2018-07-30T20:08:20Z",
"image": "th_1521804489_cfyJCMV.jpg"
}
+ },
+ {
+ "model": "articles.teg",
+ "pk": 1,
+ "fields": {
+ "name": "Культура"
+ }
+ },
+ {
+ "model": "articles.teg",
+ "pk": 2,
+ "fields": {
+ "name": "Город"
+ }
+ },
+ {
+ "model": "articles.teg",
+ "pk": 3,
+ "fields": {
+ "name": "Здоровье"
+ }
+ },
+ {
+ "model": "articles.teg",
+ "pk": 4,
+ "fields": {
+ "name": "Наука"
+ }
+ },
+ {
+ "model": "articles.teg",
+ "pk": 5,
+ "fields": {
+ "name": "Космос"
+ }
+ },
+ {
+ "model": "articles.teg",
+ "pk": 6,
+ "fields": {
+ "name": "Международные отношения"
+ }
}
]
\ No newline at end of file
diff --git a/2.2-databases-2/m2m-relations/articles/admin.py b/2.2-databases-2/m2m-relations/articles/admin.py
index 4799babf4..bb0f457ec 100644
--- a/2.2-databases-2/m2m-relations/articles/admin.py
+++ b/2.2-databases-2/m2m-relations/articles/admin.py
@@ -1,8 +1,42 @@
from django.contrib import admin
+from django.core.exceptions import ValidationError
+from django.forms import BaseInlineFormSet
-from .models import Article
+from .models import Article, Teg, ArticleTeg
+
+
+class ArticleTegInlineFormset(BaseInlineFormSet):
+ def clean(self):
+ main_teg_list = []
+ for form in self.forms:
+ # В form.cleaned_data будет словарь с данными
+ # каждой отдельной формы, которые вы можете проверить
+ if form.cleaned_data:
+ main_teg_list.append(form.cleaned_data['main_teg'])
+ # вызовом исключения ValidationError можно указать админке о наличие ошибки
+ # таким образом объект не будет сохранен,
+ # а пользователю выведется соответствующее сообщение об ошибке
+ if not any(main_teg_list):
+ raise ValidationError('Укажите основной раздел')
+ if sum(main_teg_list) > 1:
+ raise ValidationError('Основным может быть только один раздел')
+ return super().clean() # вызываем базовый код переопределяемого метода
+
+
+class ArticleTegInline(admin.TabularInline):
+ model = ArticleTeg
+ extra = 1
+ formset = ArticleTegInlineFormset
@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
- pass
+ list_display = ['id', 'title', 'text', 'published_at']
+ list_filter = ['published_at']
+ inlines = [ArticleTegInline, ]
+
+
+@admin.register(Teg)
+class ArticleAdmin(admin.ModelAdmin):
+ list_display = ['id', 'name']
+ list_filter = ['name']
diff --git a/2.2-databases-2/m2m-relations/articles/migrations/0002_teg_tegofarticle.py b/2.2-databases-2/m2m-relations/articles/migrations/0002_teg_tegofarticle.py
new file mode 100644
index 000000000..6899c998e
--- /dev/null
+++ b/2.2-databases-2/m2m-relations/articles/migrations/0002_teg_tegofarticle.py
@@ -0,0 +1,31 @@
+# Generated by Django 4.0.6 on 2022-08-11 05:01
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('articles', '0001_initial'),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='Teg',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('name', models.CharField(max_length=20)),
+ ('articles', models.ManyToManyField(related_name='tegs', to='articles.article')),
+ ],
+ ),
+ migrations.CreateModel(
+ name='TegOfArticle',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('main_teg', models.BooleanField()),
+ ('article', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='positions', to='articles.article')),
+ ('teg', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='positions', to='articles.teg')),
+ ],
+ ),
+ ]
diff --git a/2.2-databases-2/m2m-relations/articles/migrations/0003_alter_teg_options_alter_teg_name.py b/2.2-databases-2/m2m-relations/articles/migrations/0003_alter_teg_options_alter_teg_name.py
new file mode 100644
index 000000000..5c395686f
--- /dev/null
+++ b/2.2-databases-2/m2m-relations/articles/migrations/0003_alter_teg_options_alter_teg_name.py
@@ -0,0 +1,22 @@
+# Generated by Django 4.0.6 on 2022-08-11 05:23
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('articles', '0002_teg_tegofarticle'),
+ ]
+
+ operations = [
+ migrations.AlterModelOptions(
+ name='teg',
+ options={'verbose_name': 'Тег', 'verbose_name_plural': 'Теги'},
+ ),
+ migrations.AlterField(
+ model_name='teg',
+ name='name',
+ field=models.CharField(max_length=30),
+ ),
+ ]
diff --git a/2.2-databases-2/m2m-relations/articles/migrations/0004_alter_article_options_delete_tegofarticle.py b/2.2-databases-2/m2m-relations/articles/migrations/0004_alter_article_options_delete_tegofarticle.py
new file mode 100644
index 000000000..3deaff06e
--- /dev/null
+++ b/2.2-databases-2/m2m-relations/articles/migrations/0004_alter_article_options_delete_tegofarticle.py
@@ -0,0 +1,20 @@
+# Generated by Django 4.0.6 on 2022-08-11 05:44
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('articles', '0003_alter_teg_options_alter_teg_name'),
+ ]
+
+ operations = [
+ migrations.AlterModelOptions(
+ name='article',
+ options={'ordering': ['-published_at'], 'verbose_name': 'Статья', 'verbose_name_plural': 'Статьи'},
+ ),
+ migrations.DeleteModel(
+ name='TegOfArticle',
+ ),
+ ]
diff --git a/2.2-databases-2/m2m-relations/articles/migrations/0005_tegofarticle.py b/2.2-databases-2/m2m-relations/articles/migrations/0005_tegofarticle.py
new file mode 100644
index 000000000..d1239c630
--- /dev/null
+++ b/2.2-databases-2/m2m-relations/articles/migrations/0005_tegofarticle.py
@@ -0,0 +1,23 @@
+# Generated by Django 4.0.6 on 2022-08-11 06:21
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('articles', '0004_alter_article_options_delete_tegofarticle'),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='TegOfArticle',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('main_teg', models.BooleanField()),
+ ('article', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='positions', to='articles.article')),
+ ('teg', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='positions', to='articles.teg')),
+ ],
+ ),
+ ]
diff --git a/2.2-databases-2/m2m-relations/articles/migrations/0006_alter_teg_options_alter_tegofarticle_article_and_more.py b/2.2-databases-2/m2m-relations/articles/migrations/0006_alter_teg_options_alter_tegofarticle_article_and_more.py
new file mode 100644
index 000000000..8cb047c20
--- /dev/null
+++ b/2.2-databases-2/m2m-relations/articles/migrations/0006_alter_teg_options_alter_tegofarticle_article_and_more.py
@@ -0,0 +1,28 @@
+# Generated by Django 4.0.6 on 2022-08-11 10:12
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('articles', '0005_tegofarticle'),
+ ]
+
+ operations = [
+ migrations.AlterModelOptions(
+ name='teg',
+ options={'verbose_name': 'Раздел', 'verbose_name_plural': 'Разделы'},
+ ),
+ migrations.AlterField(
+ model_name='tegofarticle',
+ name='article',
+ field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='scopes', to='articles.article'),
+ ),
+ migrations.AlterField(
+ model_name='tegofarticle',
+ name='teg',
+ field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='scopes', to='articles.teg'),
+ ),
+ ]
diff --git a/2.2-databases-2/m2m-relations/articles/migrations/0007_alter_teg_articles_alter_tegofarticle_article_and_more.py b/2.2-databases-2/m2m-relations/articles/migrations/0007_alter_teg_articles_alter_tegofarticle_article_and_more.py
new file mode 100644
index 000000000..dbbd00231
--- /dev/null
+++ b/2.2-databases-2/m2m-relations/articles/migrations/0007_alter_teg_articles_alter_tegofarticle_article_and_more.py
@@ -0,0 +1,29 @@
+# Generated by Django 4.0.6 on 2022-08-11 10:17
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('articles', '0006_alter_teg_options_alter_tegofarticle_article_and_more'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='teg',
+ name='articles',
+ field=models.ManyToManyField(related_name='scopes', to='articles.article'),
+ ),
+ migrations.AlterField(
+ model_name='tegofarticle',
+ name='article',
+ field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='counts', to='articles.article'),
+ ),
+ migrations.AlterField(
+ model_name='tegofarticle',
+ name='teg',
+ field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='counts', to='articles.teg'),
+ ),
+ ]
diff --git a/2.2-databases-2/m2m-relations/articles/migrations/0008_remove_teg_articles_remove_tegofarticle_article_and_more.py b/2.2-databases-2/m2m-relations/articles/migrations/0008_remove_teg_articles_remove_tegofarticle_article_and_more.py
new file mode 100644
index 000000000..cead80207
--- /dev/null
+++ b/2.2-databases-2/m2m-relations/articles/migrations/0008_remove_teg_articles_remove_tegofarticle_article_and_more.py
@@ -0,0 +1,34 @@
+# Generated by Django 4.0.6 on 2022-08-11 10:57
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('articles', '0007_alter_teg_articles_alter_tegofarticle_article_and_more'),
+ ]
+
+ operations = [
+ migrations.RemoveField(
+ model_name='teg',
+ name='articles',
+ ),
+ migrations.RemoveField(
+ model_name='tegofarticle',
+ name='article',
+ ),
+ migrations.RemoveField(
+ model_name='tegofarticle',
+ name='teg',
+ ),
+ migrations.DeleteModel(
+ name='Article',
+ ),
+ migrations.DeleteModel(
+ name='Teg',
+ ),
+ migrations.DeleteModel(
+ name='TegOfArticle',
+ ),
+ ]
diff --git a/2.2-databases-2/m2m-relations/articles/migrations/0009_initial.py b/2.2-databases-2/m2m-relations/articles/migrations/0009_initial.py
new file mode 100644
index 000000000..383d5b03a
--- /dev/null
+++ b/2.2-databases-2/m2m-relations/articles/migrations/0009_initial.py
@@ -0,0 +1,52 @@
+# Generated by Django 4.0.6 on 2022-08-11 11:02
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+ initial = True
+
+ dependencies = [
+ ('articles', '0008_remove_teg_articles_remove_tegofarticle_article_and_more'),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='Article',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('title', models.CharField(max_length=256, verbose_name='Название')),
+ ('text', models.TextField(verbose_name='Текст')),
+ ('published_at', models.DateTimeField(verbose_name='Дата публикации')),
+ ('image', models.ImageField(blank=True, null=True, upload_to='', verbose_name='Изображение')),
+ ],
+ options={
+ 'verbose_name': 'Статья',
+ 'verbose_name_plural': 'Статьи',
+ 'ordering': ['-published_at'],
+ },
+ ),
+ migrations.CreateModel(
+ name='Teg',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('name', models.CharField(max_length=30)),
+ ('articles', models.ManyToManyField(related_name='scopes', to='articles.article')),
+ ],
+ options={
+ 'verbose_name': 'Раздел',
+ 'verbose_name_plural': 'Разделы',
+ },
+ ),
+ migrations.CreateModel(
+ name='TegOfArticle',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('main_teg', models.BooleanField()),
+ ('article', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='counts', to='articles.article')),
+ ('teg', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='counts', to='articles.teg')),
+ ],
+ ),
+ ]
diff --git a/2.2-databases-2/m2m-relations/articles/migrations/0010_remove_tegofarticle_article_remove_tegofarticle_teg_and_more.py b/2.2-databases-2/m2m-relations/articles/migrations/0010_remove_tegofarticle_article_remove_tegofarticle_teg_and_more.py
new file mode 100644
index 000000000..f12ac91eb
--- /dev/null
+++ b/2.2-databases-2/m2m-relations/articles/migrations/0010_remove_tegofarticle_article_remove_tegofarticle_teg_and_more.py
@@ -0,0 +1,31 @@
+# Generated by Django 4.0.6 on 2022-08-11 11:18
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('articles', '0009_initial'),
+ ]
+
+ operations = [
+ migrations.RemoveField(
+ model_name='tegofarticle',
+ name='article',
+ ),
+ migrations.RemoveField(
+ model_name='tegofarticle',
+ name='teg',
+ ),
+ migrations.AlterModelOptions(
+ name='article',
+ options={'verbose_name': 'Статья', 'verbose_name_plural': 'Статьи'},
+ ),
+ migrations.DeleteModel(
+ name='Teg',
+ ),
+ migrations.DeleteModel(
+ name='TegOfArticle',
+ ),
+ ]
diff --git a/2.2-databases-2/m2m-relations/articles/migrations/0011_teg.py b/2.2-databases-2/m2m-relations/articles/migrations/0011_teg.py
new file mode 100644
index 000000000..20119c6dd
--- /dev/null
+++ b/2.2-databases-2/m2m-relations/articles/migrations/0011_teg.py
@@ -0,0 +1,26 @@
+# Generated by Django 4.0.6 on 2022-08-11 11:48
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('articles', '0010_remove_tegofarticle_article_remove_tegofarticle_teg_and_more'),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='Teg',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('name', models.CharField(max_length=30)),
+ ('main_teg', models.BooleanField(verbose_name='Основной')),
+ ('teg', models.ManyToManyField(related_name='scopes', to='articles.article')),
+ ],
+ options={
+ 'verbose_name': 'Раздел',
+ 'verbose_name_plural': 'Разделы',
+ },
+ ),
+ ]
diff --git a/2.2-databases-2/m2m-relations/articles/migrations/0012_remove_teg_main_teg.py b/2.2-databases-2/m2m-relations/articles/migrations/0012_remove_teg_main_teg.py
new file mode 100644
index 000000000..27655fb19
--- /dev/null
+++ b/2.2-databases-2/m2m-relations/articles/migrations/0012_remove_teg_main_teg.py
@@ -0,0 +1,17 @@
+# Generated by Django 4.0.6 on 2022-08-11 11:50
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('articles', '0011_teg'),
+ ]
+
+ operations = [
+ migrations.RemoveField(
+ model_name='teg',
+ name='main_teg',
+ ),
+ ]
diff --git a/2.2-databases-2/m2m-relations/articles/migrations/0013_remove_teg_teg_articleteg.py b/2.2-databases-2/m2m-relations/articles/migrations/0013_remove_teg_teg_articleteg.py
new file mode 100644
index 000000000..1e63a31a0
--- /dev/null
+++ b/2.2-databases-2/m2m-relations/articles/migrations/0013_remove_teg_teg_articleteg.py
@@ -0,0 +1,27 @@
+# Generated by Django 4.0.6 on 2022-08-11 19:18
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('articles', '0012_remove_teg_main_teg'),
+ ]
+
+ operations = [
+ migrations.RemoveField(
+ model_name='teg',
+ name='teg',
+ ),
+ migrations.CreateModel(
+ name='ArticleTeg',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('main_teg', models.BooleanField(verbose_name='Основной')),
+ ('article', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='scopes', to='articles.article')),
+ ('teg', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='scopes', to='articles.teg')),
+ ],
+ ),
+ ]
diff --git a/2.2-databases-2/m2m-relations/articles/models.py b/2.2-databases-2/m2m-relations/articles/models.py
index 0486c9fe8..0648613b9 100644
--- a/2.2-databases-2/m2m-relations/articles/models.py
+++ b/2.2-databases-2/m2m-relations/articles/models.py
@@ -11,6 +11,25 @@ class Article(models.Model):
class Meta:
verbose_name = 'Статья'
verbose_name_plural = 'Статьи'
+ ordering = ['-published_at']
def __str__(self):
return self.title
+
+
+class Teg(models.Model):
+ name = models.CharField(max_length=30)
+ articles = models.ManyToManyField(Article, related_name='articles', through='ArticleTeg')
+
+ class Meta:
+ verbose_name = 'Раздел'
+ verbose_name_plural = 'Разделы'
+
+ def __str__(self):
+ return self.name
+
+
+class ArticleTeg(models.Model):
+ article = models.ForeignKey(Article, on_delete=models.CASCADE, related_name='scopes')
+ teg = models.ForeignKey(Teg, on_delete=models.CASCADE, related_name='scopes')
+ main_teg = models.BooleanField(verbose_name='Основной')
\ No newline at end of file
diff --git a/2.2-databases-2/m2m-relations/articles/views.py b/2.2-databases-2/m2m-relations/articles/views.py
index e1d022b45..9118ba003 100644
--- a/2.2-databases-2/m2m-relations/articles/views.py
+++ b/2.2-databases-2/m2m-relations/articles/views.py
@@ -5,10 +5,9 @@
def articles_list(request):
template = 'articles/news.html'
- context = {}
-
+ articles = Article.objects.all()
+ context = {'object_list': articles}
# используйте этот параметр для упорядочивания результатов
# https://docs.djangoproject.com/en/3.1/ref/models/querysets/#django.db.models.query.QuerySet.order_by
- ordering = '-published_at'
return render(request, template, context)
diff --git a/2.2-databases-2/m2m-relations/templates/articles/news.html b/2.2-databases-2/m2m-relations/templates/articles/news.html
index 17d5a5ddc..da5decaba 100644
--- a/2.2-databases-2/m2m-relations/templates/articles/news.html
+++ b/2.2-databases-2/m2m-relations/templates/articles/news.html
@@ -16,7 +16,7 @@