wmw_branch
parent
f01bf37760
commit
515819bc3d
@ -0,0 +1,41 @@
|
||||
from django.core.management.base import BaseCommand
|
||||
from blog.models import Category
|
||||
|
||||
|
||||
class Command(BaseCommand):
|
||||
help = '创建文章分类'
|
||||
|
||||
def handle(self, *args, **options):
|
||||
categories = [
|
||||
'技术',
|
||||
'生活',
|
||||
'旅行',
|
||||
'美食',
|
||||
'摄影',
|
||||
'读书',
|
||||
'电影',
|
||||
'音乐',
|
||||
'编程',
|
||||
'设计',
|
||||
'健康',
|
||||
'教育',
|
||||
'职场',
|
||||
'财经',
|
||||
'历史',
|
||||
'文化',
|
||||
'体育',
|
||||
'游戏',
|
||||
'科技'
|
||||
]
|
||||
|
||||
for name in categories:
|
||||
category, created = Category.objects.get_or_create(
|
||||
name=name,
|
||||
defaults={'parent_category': None}
|
||||
)
|
||||
if created:
|
||||
self.stdout.write(self.style.SUCCESS(f'创建分类: {name}'))
|
||||
else:
|
||||
self.stdout.write(self.style.WARNING(f'分类已存在: {name}'))
|
||||
|
||||
self.stdout.write(self.style.SUCCESS('分类创建完成'))
|
||||
@ -0,0 +1,13 @@
|
||||
from django.core.management.base import BaseCommand
|
||||
from blog.models import Category
|
||||
|
||||
|
||||
class Command(BaseCommand):
|
||||
help = '列出所有文章分类'
|
||||
|
||||
def handle(self, *args, **options):
|
||||
categories = Category.objects.all()
|
||||
self.stdout.write('当前数据库中的分类:')
|
||||
for category in categories:
|
||||
self.stdout.write(f'- {category.name} (ID: {category.id})')
|
||||
self.stdout.write(f'总计: {categories.count()} 个分类')
|
||||
@ -0,0 +1,116 @@
|
||||
{% extends "share_layout/base.html" %}
|
||||
{% load static %}
|
||||
{% load i18n %}
|
||||
|
||||
{% block title %}{% trans "Create Article" %}{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="container">
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
<h2>{% trans "Create Article" %}</h2>
|
||||
<form method="post" enctype="multipart/form-data">
|
||||
{% csrf_token %}
|
||||
<div class="mb-3">
|
||||
<label for="{{ form.title.id_for_label }}" class="form-label">{{ form.title.label }}</label>
|
||||
{{ form.title }}
|
||||
{% if form.title.errors %}
|
||||
<div class="text-danger">
|
||||
{{ form.title.errors }}
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
<div class="mb-3">
|
||||
<label for="{{ form.body.id_for_label }}" class="form-label">{{ form.body.label }}</label>
|
||||
{{ form.body }}
|
||||
{% if form.body.errors %}
|
||||
<div class="text-danger">
|
||||
{{ form.body.errors }}
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-6 mb-3">
|
||||
<label for="{{ form.status.id_for_label }}" class="form-label">{{ form.status.label }}</label>
|
||||
{{ form.status }}
|
||||
{% if form.status.errors %}
|
||||
<div class="text-danger">
|
||||
{{ form.status.errors }}
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
<div class="col-md-6 mb-3">
|
||||
<label for="{{ form.comment_status.id_for_label }}" class="form-label">{{ form.comment_status.label }}</label>
|
||||
{{ form.comment_status }}
|
||||
{% if form.comment_status.errors %}
|
||||
<div class="text-danger">
|
||||
{{ form.comment_status.errors }}
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-6 mb-3">
|
||||
<label for="{{ form.type.id_for_label }}" class="form-label">{{ form.type.label }}</label>
|
||||
{{ form.type }}
|
||||
{% if form.type.errors %}
|
||||
<div class="text-danger">
|
||||
{{ form.type.errors }}
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
<div class="col-md-6 mb-3">
|
||||
<label for="{{ form.category.id_for_label }}" class="form-label">{{ form.category.label }}</label>
|
||||
{{ form.category }}
|
||||
<datalist id="category-list">
|
||||
{% for category in all_categories %}
|
||||
<option value="{{ category.name }}">
|
||||
{% endfor %}
|
||||
</datalist>
|
||||
{% if form.category.errors %}
|
||||
<div class="text-danger">
|
||||
{{ form.category.errors }}
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="mb-3">
|
||||
<label for="{{ form.tags.id_for_label }}" class="form-label">{{ form.tags.label }}</label>
|
||||
{{ form.tags }}
|
||||
<datalist id="tag-list">
|
||||
{% for tag in all_tags %}
|
||||
<option value="{{ tag.name }}">
|
||||
{% endfor %}
|
||||
</datalist>
|
||||
{% if form.tags.errors %}
|
||||
<div class="text-danger">
|
||||
{{ form.tags.errors }}
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
<div class="mb-3 form-check">
|
||||
{{ form.show_toc }}
|
||||
<label for="{{ form.show_toc.id_for_label }}" class="form-check-label">{{ form.show_toc.label }}</label>
|
||||
{% if form.show_toc.errors %}
|
||||
<div class="text-danger">
|
||||
{{ form.show_toc.errors }}
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
<div class="mb-3">
|
||||
<button type="submit" class="btn btn-primary">{% trans "发布" %}</button>
|
||||
<a href="{% url 'blog:index' %}" class="btn btn-secondary">{% trans "取消" %}</a>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
@ -0,0 +1,118 @@
|
||||
{% extends "share_layout/base.html" %}
|
||||
{% load static %}
|
||||
{% load i18n %}
|
||||
|
||||
{% block title %}{% trans "Edit Article" %}{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="container">
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
<h2>{% trans "Edit Article" %}: {{ article.title }}</h2>
|
||||
<form method="post" enctype="multipart/form-data">
|
||||
{% csrf_token %}
|
||||
<div class="mb-3">
|
||||
<label for="{{ form.title.id_for_label }}" class="form-label">{{ form.title.label }}</label>
|
||||
{{ form.title }}
|
||||
{% if form.title.errors %}
|
||||
<div class="text-danger">
|
||||
{{ form.title.errors }}
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
<div class="mb-3">
|
||||
<label for="{{ form.body.id_for_label }}" class="form-label">{{ form.body.label }}</label>
|
||||
{{ form.body }}
|
||||
{% if form.body.errors %}
|
||||
<div class="text-danger">
|
||||
{{ form.body.errors }}
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-6 mb-3">
|
||||
<label for="{{ form.status.id_for_label }}" class="form-label">{{ form.status.label }}</label>
|
||||
{{ form.status }}
|
||||
{% if form.status.errors %}
|
||||
<div class="text-danger">
|
||||
{{ form.status.errors }}
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
<div class="col-md-6 mb-3">
|
||||
<label for="{{ form.comment_status.id_for_label }}" class="form-label">{{ form.comment_status.label }}</label>
|
||||
{{ form.comment_status }}
|
||||
{% if form.comment_status.errors %}
|
||||
<div class="text-danger">
|
||||
{{ form.comment_status.errors }}
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-6 mb-3">
|
||||
<label for="{{ form.type.id_for_label }}" class="form-label">{{ form.type.label }}</label>
|
||||
{{ form.type }}
|
||||
{% if form.type.errors %}
|
||||
<div class="text-danger">
|
||||
{{ form.type.errors }}
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
<div class="col-md-6 mb-3">
|
||||
<label for="{{ form.category.id_for_label }}" class="form-label">{{ form.category.label }}</label>
|
||||
{{ form.category }}
|
||||
<datalist id="category-list">
|
||||
{% for category in all_categories %}
|
||||
<option value="{{ category.name }}">
|
||||
{% endfor %}
|
||||
</datalist>
|
||||
<div class="form-text">选择现有分类或创建新分类</div>
|
||||
{% if form.category.errors %}
|
||||
<div class="text-danger">
|
||||
{{ form.category.errors }}
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="mb-3">
|
||||
<label for="{{ form.tags.id_for_label }}" class="form-label">{{ form.tags.label }}</label>
|
||||
{{ form.tags }}
|
||||
<datalist id="tag-list">
|
||||
{% for tag in all_tags %}
|
||||
<option value="{{ tag.name }}">
|
||||
{% endfor %}
|
||||
</datalist>
|
||||
<div class="form-text">选择现有标签或创建新标签,多个标签用逗号分隔</div>
|
||||
{% if form.tags.errors %}
|
||||
<div class="text-danger">
|
||||
{{ form.tags.errors }}
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
<div class="mb-3 form-check">
|
||||
{{ form.show_toc }}
|
||||
<label for="{{ form.show_toc.id_for_label }}" class="form-check-label">{{ form.show_toc.label }}</label>
|
||||
{% if form.show_toc.errors %}
|
||||
<div class="text-danger">
|
||||
{{ form.show_toc.errors }}
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
<div class="mb-3">
|
||||
<button type="submit" class="btn btn-primary">{% trans "更新" %}</button>
|
||||
<a href="{{ article.get_absolute_url }}" class="btn btn-secondary">{% trans "取消" %}</a>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
@ -0,0 +1,66 @@
|
||||
{% extends "share_layout/base.html" %}
|
||||
{% load static %}
|
||||
{% load i18n %}
|
||||
|
||||
{% block title %}{% trans "My Articles" %}{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="container">
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
<div class="d-flex justify-content-between align-items-center mb-4">
|
||||
<h2>{% trans "My Articles" %}</h2>
|
||||
<a href="{% url 'blog:article_create' %}" class="btn btn-primary">
|
||||
<i class="fas fa-plus"></i> {% trans "发布新文章" %}
|
||||
</a>
|
||||
</div>
|
||||
|
||||
{% if articles %}
|
||||
<div class="table-responsive">
|
||||
<table class="table table-striped">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>{% trans "标题" %}</th>
|
||||
<th>{% trans "状态" %}</th>
|
||||
<th>{% trans "分类" %}</th>
|
||||
<th>{% trans "创建时间" %}</th>
|
||||
<th>{% trans "浏览量" %}</th>
|
||||
<th>{% trans "操作" %}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for article in articles %}
|
||||
<tr>
|
||||
<td>
|
||||
<a href="{{ article.get_absolute_url }}">{{ article.title }}</a>
|
||||
</td>
|
||||
<td>
|
||||
{% if article.status == 'p' %}
|
||||
<span class="badge bg-success">{% trans "已发布" %}</span>
|
||||
{% else %}
|
||||
<span class="badge bg-secondary">{% trans "草稿" %}</span>
|
||||
{% endif %}
|
||||
</td>
|
||||
<td>{{ article.category.name }}</td>
|
||||
<td>{{ article.creation_time|date:"Y-m-d H:i" }}</td>
|
||||
<td>{{ article.views }}</td>
|
||||
<td>
|
||||
<a href="{% url 'blog:article_edit' article.id %}" class="btn btn-sm btn-outline-primary">
|
||||
<i class="fas fa-edit"></i> {% trans "编辑" %}
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
{% else %}
|
||||
<div class="alert alert-info">
|
||||
{% trans "您还没有创建任何文章。" %}
|
||||
<a href="{% url 'blog:article_create' %}">{% trans "创建您的第一篇文章" %}</a>
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
Loading…
Reference in new issue