① 视图、模板和静态文件 —— 模板引擎设置
{% for ... in ... %} {% endfor %}
{% if ... %} {% else %} {% endif %}
{{ variable }}
'DIRS': [os.path.join(BASE_DIR, 'templates')]
STATIC_URL = '/static/'
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]
{% load static %}
# 用于构成资源文件完整 URL
{% static %}
② Django 需要一个 url.py 作为入口,根路由配置
from django.conf.urls import url
from django.urls import path
urlpatterns = []
在之前完成的论坛主页、话题和回帖的视图,可以将每个配置在路由中。
urlpatterns = [
path("home/", views.BoardListView.as_view(), name="home"),
path("topic/<pk>/", views.TopicListView.as_view(), name="topics"),
path("topic/<pk>/new/", views.new_topic, name="new_topic"),
path("posts/<pk>/new/<topic_pk>/", views.PostListView.as_view(), name="new_posts"),
path("posts/<pk>/topic/<topic_pk>/reply/", views.reply_topic, name="reply_topic"),
path("posts/<pk>/topic/<topic_pk>/new/<post_pk>/edit/", views.PostUpdateView.as_view(), name="edit_post"),
]
③ 前端 form 表单,创建话题、回复帖子和修改帖子的复用模板
# 模板过滤器
{% load form_tags widget_tweaks %}
{% if form.non_field_errors %}
<div class="alert alert-danger" role="alert">
{% for error in form.non_field_errors %}
<p{% if forloop.last %} class="mb-0"{% endif %}>{{ error }}</p>
{% endfor %}
</div>
{% endif %}
{% for field in form %}
<div class="form-group">
{{ field.label_tag }}
{% render_field field class=field|input_class %}
{% for error in field.errors %}
<div class="invalid-feedback">
{{ error }}
</div>
{% endfor %}
{% if field.help_text %}
<small class="form-text text-muted">
{{ field.help_text|safe }}
</small>
{% endif %}
</div>
{% endfor %}