diff --git a/data/db.sqlite3 b/data/db.sqlite3 index 344d391..1941eb4 100644 Binary files a/data/db.sqlite3 and b/data/db.sqlite3 differ diff --git a/links/forms.py b/links/forms.py index 78d52e8..7c1a640 100644 --- a/links/forms.py +++ b/links/forms.py @@ -65,9 +65,10 @@ class PageForm(forms.ModelForm): class PostForm(forms.ModelForm): class Meta: model = Post - fields = ['title', 'type', 'content'] + fields = ['title', 'type', 'content', 'tags'] widgets = { 'content': forms.Textarea(attrs={'rows': 20}), + 'tags': forms.SelectMultiple(attrs={'class': 'select2'}), } class MultipleFileInput(forms.ClearableFileInput): @@ -110,9 +111,9 @@ class ImageUploadForm(forms.ModelForm): class TagForm(forms.ModelForm): class Meta: model = Tag - fields = ['name', 'description'] + fields = ['name'] widgets = { - 'description': forms.Textarea(attrs={'rows': 3}), + 'name': forms.TextInput(attrs={'class': 'mt-1 block w-full border border-gray-300 rounded-md shadow-sm py-2 px-3 focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm'}), } class IPTVChannelForm(forms.ModelForm): diff --git a/links/migrations/0031_remove_tag_description_remove_tag_slug_post_tags_and_more.py b/links/migrations/0031_remove_tag_description_remove_tag_slug_post_tags_and_more.py new file mode 100644 index 0000000..7dff827 --- /dev/null +++ b/links/migrations/0031_remove_tag_description_remove_tag_slug_post_tags_and_more.py @@ -0,0 +1,31 @@ +# Generated by Django 5.0.10 on 2025-02-21 07:07 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('links', '0030_rename_newsletter_post_alter_post_options'), + ] + + operations = [ + migrations.RemoveField( + model_name='tag', + name='description', + ), + migrations.RemoveField( + model_name='tag', + name='slug', + ), + migrations.AddField( + model_name='post', + name='tags', + field=models.ManyToManyField(blank=True, related_name='posts', to='links.tag'), + ), + migrations.AlterField( + model_name='tag', + name='name', + field=models.CharField(max_length=50, unique=True, verbose_name='Name'), + ), + ] diff --git a/links/models.py b/links/models.py index 9768967..dfd7d26 100644 --- a/links/models.py +++ b/links/models.py @@ -143,9 +143,7 @@ def generate_random_color(): return random.choice(colors) class Tag(models.Model): - name = models.CharField(_('Name'), max_length=100, unique=True) - slug = models.SlugField(_('Slug'), max_length=100, unique=True) - description = models.TextField(_('Description'), blank=True) + name = models.CharField(_('Name'), max_length=50, unique=True) created_at = models.DateTimeField(_('Created at'), auto_now_add=True) updated_at = models.DateTimeField(_('Updated at'), auto_now=True) @@ -158,12 +156,7 @@ class Tag(models.Model): return self.name def get_absolute_url(self): - return reverse('tag-detail', kwargs={'slug': self.slug}) - - def save(self, *args, **kwargs): - if not self.slug: - self.slug = slugify(self.name) - super().save(*args, **kwargs) + return reverse('tag-detail', kwargs={'pk': self.pk}) class Page(models.Model): class ProcessStatus(models.TextChoices): @@ -260,6 +253,7 @@ class Post(models.Model): content = models.TextField(_('Content')) created_at = models.DateTimeField(_('Created at'), auto_now_add=True) updated_at = models.DateTimeField(_('Updated at'), auto_now=True) + tags = models.ManyToManyField('Tag', blank=True, related_name='posts') class Meta: ordering = ['-created_at'] diff --git a/links/serializers.py b/links/serializers.py index 02bf653..857cd3d 100644 --- a/links/serializers.py +++ b/links/serializers.py @@ -1,5 +1,5 @@ from rest_framework import serializers -from .models import Page, Post, ImageCollection, Image +from .models import Page, Post, ImageCollection, Image, Tag class PageSerializer(serializers.ModelSerializer): class Meta: @@ -10,9 +10,11 @@ class PageSerializer(serializers.ModelSerializer): 'created_at', 'updated_at'] class PostSerializer(serializers.ModelSerializer): + tags = serializers.PrimaryKeyRelatedField(many=True, queryset=Tag.objects.all(), required=False) + class Meta: model = Post - fields = ['id', 'title', 'type', 'content', 'created_at', 'updated_at'] + fields = ['id', 'title', 'type', 'content', 'tags', 'created_at', 'updated_at'] read_only_fields = ['id', 'created_at', 'updated_at'] extra_kwargs = { 'title': {'required': True}, diff --git a/links/templates/links/post_detail.html b/links/templates/links/post_detail.html index 0b3018f..9f888de 100644 --- a/links/templates/links/post_detail.html +++ b/links/templates/links/post_detail.html @@ -158,22 +158,31 @@
{{ form.tags.errors.0 }}
+ {% endif %} +{% trans "Select existing tags or create new ones" %}
+