Explorar o código

完成了分类查找,标签功能和标签查找功能,接下来做文章的标题图

Shellmiao %!s(int64=4) %!d(string=hai) anos
pai
achega
8072b229ae

+ 1 - 1
MyBlog/article/form.py

@@ -5,4 +5,4 @@ from .models import ArticlePost
 class ArticlePostForm(forms.ModelForm):
     class Meta:
         model = ArticlePost
-        fields = ('title', 'body')
+        fields = ('title', 'body', 'tags')

+ 20 - 0
MyBlog/article/migrations/0005_articlepost_tags.py

@@ -0,0 +1,20 @@
+# Generated by Django 3.1.1 on 2021-01-28 07:42
+
+from django.db import migrations
+import taggit.managers
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('taggit', '0003_taggeditem_add_unique_index'),
+        ('article', '0004_articlecolumn_tags'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='articlepost',
+            name='tags',
+            field=taggit.managers.TaggableManager(blank=True, help_text='A comma-separated list of tags.', through='taggit.TaggedItem', to='taggit.Tag', verbose_name='Tags'),
+        ),
+    ]

+ 17 - 0
MyBlog/article/migrations/0006_remove_articlecolumn_tags.py

@@ -0,0 +1,17 @@
+# Generated by Django 3.1.1 on 2021-01-28 10:31
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('article', '0005_articlepost_tags'),
+    ]
+
+    operations = [
+        migrations.RemoveField(
+            model_name='articlecolumn',
+            name='tags',
+        ),
+    ]

+ 1 - 1
MyBlog/article/models.py

@@ -10,7 +10,6 @@ from taggit.managers import TaggableManager
 class ArticleColumn(models.Model):
     title = models.CharField(max_length=100, blank=True)
     created = models.DateTimeField(default=timezone.now)
-    tags = TaggableManager(blank=True)
 
     def __str__(self):
         return self.title
@@ -21,6 +20,7 @@ class ArticlePost(models.Model):
     author = models.ForeignKey(User, on_delete=models.CASCADE)
     title = models.CharField(max_length=100)
     body = models.TextField()
+    tags = TaggableManager(blank=True)
     created = models.DateTimeField(default=timezone.now)  # 使用timezone.now()时 进行数据迁移会,有警告
     updated = models.DateTimeField(default=timezone.now)
     total_views = models.PositiveIntegerField(default=0)

+ 20 - 16
MyBlog/article/views.py

@@ -15,27 +15,30 @@ from comment.models import Comment
 def article_list(request):
     search = request.GET.get('search')
     order = request.GET.get('order')
+    tag = request.GET.get('tag')
+    column = request.GET.get('column')
+    article_list = ArticlePost.objects.all()
+    # 搜索查询集
     if search:
-        if order == 'total_views':
-            article_list = ArticlePost.objects.filter(
-                Q(title__icontains=search) |
-                Q(body__icontains=search)
-            ).order_by('-total_views')
-        else:
-            article_list = ArticlePost.objects.filter(
-                Q(title__icontains=search) |
-                Q(body__icontains=search)
-            )
+        article_list = article_list.filter(
+            Q(title__icontains=search) |
+            Q(body__icontains=search)
+        )
     else:
         search = ''
-        if order == 'total_views':
-            article_list = ArticlePost.objects.all().order_by('total_views')
-        else:
-            article_list = ArticlePost.objects.all()
-    paginator = Paginator(article_list, 3)
+    # 分类查询集
+    if column is not None and column.isdigit():
+        article_list = article_list.filter(column=column)
+    # 标签查询集
+    if tag and tag != 'None':
+        article_list = article_list.filter(tags__name__in=[tag])
+    # 排序
+    if order == 'total_views':
+        article_list = article_list.order_by('-total_views')
+    paginator = Paginator(article_list, 10)
     page = request.GET.get('page')
     articles = paginator.get_page(page)
-    context = {'articles': articles, 'order': order, 'search': search}
+    context = {'articles': articles, 'order': order, 'search': search, 'column': column, 'tag': tag, }
     return render(request, 'article/list.html', context)
 
 
@@ -68,6 +71,7 @@ def article_create(request):
                 new_article.column = ArticleColumn.objects.get(id=request.POST['column'])
             # 将新文章保存到数据库中
             new_article.save()
+            article_post_form.save_m2m()
             return redirect("article:article_list")
         # 如果数据不合法,返回错误信息
         else:

BIN=BIN
MyBlog/db.sqlite3


+ 6 - 0
MyBlog/templates/article/create.html

@@ -31,6 +31,12 @@
                             {% endfor %}
                         </select>
                     </div>
+                    <div class="form-group">
+                        <label for="tags">
+                            文章标签
+                        </label>
+                        <input type="text" class="form-control col-3" id="tags" name="tags">
+                    </div>
                     <div class="form-group">
                         <label for="body">
                             文章正文

+ 19 - 7
MyBlog/templates/article/list.html

@@ -5,15 +5,16 @@
 {% endblock title %}
 {% block content %}
     <div class="container">
+        <hr>
         <nav aria-label="breadcrumb">
             <ol class="breadcrumb">
                 <li class="breadcrumb-item">
-                    <a href="{% url 'article:article_list' %}?search={{ search }}">
+                    <a href="{% url 'article:article_list' %}?search={{ search }}&tag={{ tag }}&column={{ column }}">
                         最新
                     </a>
                 </li>
                 <li class="breadcrumb-item">
-                    <a href="{% url 'article:article_list' %}?order=total_views&search={{ search }}">
+                    <a href="{% url 'article:article_list' %}?order=total_views&search={{ search }}&tag={{ tag }}&column={{ column }}">
                         最热
                     </a>
                 </li>
@@ -47,7 +48,8 @@
                 <div class="col-12">
                     {% if article.column %}
                         <button type="button"
-                            class="btn btn-sm mb-2
+                                onclick="window.open('{% url 'article:article_list' %}?search={{ search }}&tag={{ tag }}&column={{ article.column.id }}')"
+                                class="btn btn-sm mb-2
                                 {% if article.column.title == 'Django' %}
                                     btn-success
                                 {% elif article.column.title == 'Java' %}
@@ -60,6 +62,15 @@
                             {{ article.column }}
                         </button>
                     {% endif %}
+                    <!--标签-->
+                    <span>
+                        {% for tag in article.tags.all %}
+                            <a href="{% url 'article:article_list' %}?tag={{ tag }}&search={{ search }}&column={{ column }}"
+                               class="badge badge-secondary">
+                            {{ tag }}
+                            </a>
+                        {% endfor %}
+                    </span>
                     <!--标题-->
                     <h4>
                         <b>
@@ -97,11 +108,12 @@
             <span class="step-links">
                 <!--如果不是第一页,则显示上翻的按钮-->
                 {% if articles.has_previous %}
-                    <a href="?page=1&order={{ order }}&search={{ search }}" class="btn btn-success">
+                    <a href="?page=1&order={{ order }}&search={{ search }}&tag={{ tag }}&column={{ column }}"
+                       class="btn btn-success">
                     &laquo;1
                     </a>
                     <span>...</span>
-                    <a href="?page={{ articles.previous_page_number }}&order={{ order }}&search={{ search }}"
+                    <a href="?page={{ articles.previous_page_number }}&order={{ order }}&search={{ search }}&tag={{ tag }}&column={{ column }}"
                        class="btn btn-secondary">
                     {{ articles.previous_page_number }}
                     </a>
@@ -111,12 +123,12 @@
                     {{ articles.number }}
                 </span>
                 {% if articles.has_next %}
-                    <a href="?page={{ articles.next_page_number }}&order={{ order }}&search={{ search }}"
+                    <a href="?page={{ articles.next_page_number }}&order={{ order }}&search={{ search }}&tag={{ tag }}&column={{ column }}"
                        class="btn btn-secondary">
                     {{ articles.next_page_number }}
                     </a>
                     <span>...</span>
-                    <a href="?page={{ articles.paginator.num_pages }}&order={{ order }}&search={{ search }}"
+                    <a href="?page={{ articles.paginator.num_pages }}&order={{ order }}&search={{ search }}&tag={{ tag }}&column={{ column }}"
                        class="btn btn-success">
                     {{ articles.paginator.num_pages }} &raquo
                     </a>

+ 1 - 1
MyBlog/templates/footer.html

@@ -3,7 +3,7 @@
 <div>
     <br><br><br>
 </div>
-<footer class="py-3 bg-dark fixed-bottom">
+<footer class="py-3 bg-dark">
     <div class="container">
         <p class="m-0 text-center text-white">Copyright &copy; blog.shellmiao.com 2021</p>
     </div>