在
这里创建一个forms.py
from django import forms
from .models import Topic
class TopicForm(forms.ModelForm):
class Meta:
model = Topic
fields = ['text']
lables = {'text': ''}
这个表单用来记录传递用户自己新建的Topic,django会根据你这里的配置做一个Topic的表单,它会去验证用户输入的信息,确认信息是不是正确的数据类型、确认不是恶意信息,对有效信息进行处理并将其保存到数据库合适的位置。
当然要新建个功能,先要把这个前台调用后台的路径配置到url中
learning_logs/urls.py中
"""定义learning_logs的URL模式"""
from django.urls import path
from . import views
urlpatterns = [
# 主页
path('', views.index, name='index'),
# 显示所有的主题
path('topics/', views.topics, name='topics'),
# 特定主题的详细页面
path('topics/<int:topic_id>/', views.topic, name='topic'),
# 用于添加新主题的网页
path('new_topic/', views.new_topic, name='new_topic'),
]
然后编写new_topic的视图函数
views.py
from django.shortcuts import render
from django.http import HttpResponseRedirect
from django.urls import reverse
from .models import Topic
from .forms import TopicForm
# Create your views here.
def index(request):
"""学习笔记的主页"""
return render(request, 'learning_logs/index.html')
def topics(request):
"""显示所有主题"""
topics = Topic.objects.order_by('date_added')
# 这里定义了一个将要发送给模板的上下文,是一个字典,其中的键在模板中将用来访问数据
context = {'topics': topics}
return render(request, 'learning_logs/topics.html', context)
def topic(request, topic_id):
"""显示单个主题及其所有的条目"""
topic = Topic.objects.get(id=topic_id)
# date_added前边的减号是按降序排列的意思
entries = topic.entry_set.order_by('-date_added')
context = {'topic': topic, 'entries': entries}
return render(request, 'learning_logs/topic.html', context)
def new_topic(request):
"""添加新主题"""
if request.method != 'POST':
# 未提交数据:创建一个新表单,说明是刚打开页面供客户输入,请求一个空表单
form = TopicForm()
else:
# POST提交的数据,对数据进行处理
form = TopicForm(request.POST)
if form.is_valid():
form.save()
return HttpResponseRedirect(reverse('learning_logs:topics'))
context = {'form': form}
return render(request, 'learning_logs/new_topic.html', context)
创建一个new_topic.html的页面,位置就不用说了吧
{% extends "learning_logs/base.html" %}
{% block content %}
<p>Add a new topic:</p>
<form action="{% url 'learning_logs:new_topic' %}" method='post'>
{% csrf_token %}
{{ form.as_p }}
<button name="submit">add topic</button>
</form>
{% endblock content %}
这里{% csrf_token %}是模板的标签,用来防止攻击者利用表单来获得对服务器未经授权的访问(这种攻击被称为跨站请求伪造)
{{ form.as_p }}就更牛*了,你只要往这一甩,不用自己输入表单的具体哪些字段了,django会给你生成的,修饰符as_p让django以段落格式渲染所有表单元素。
在topics.html页面里添加一个到new_topic的链接
topics.html
{% extends "learning_logs/base.html" %}
{% block content %}
<p>Topics</p>
<ul>
{% for topic in topics %}
<li>
<a href="{% url 'learning_logs:topic' topic.id %}">{{ topic }}</a>
</li>
{% empty %}
<li>No topics have been added yet.</li>
{% endfor %}
</ul>
<a href="{% url 'learning_logs:new_topic' %}">Add a new topic:</a>
{% endblock content %}
效果如下:
当然能添加topic,下面的entry条目也应该有这添加功能
跟上边的也差不多,先forms.py添加条目表单
forms.py
from django import forms
from .models import Topic, Entry
class TopicForm(forms.ModelForm):
class Meta:
model = Topic
fields = ['text']
lables = {'text': ''}
class EntryForm(forms.ModelForm):
class Meta:
model = Entry
fields = ['text']
lables = {'text': ''}
widgets = {'text':forms.Textarea(attrs={'cols': 80})}
同样地修改urls.py
"""定义learning_logs的URL模式"""
from django.urls import path
from . import views
urlpatterns = [
# 主页
path('', views.index, name='index'),
# 显示所有的主题
path('topics/', views.topics, name='topics'),
# 特定主题的详细页面
path('topics/<int:topic_id>/', views.topic, name='topic'),
# 用于添加新主题的网页
path('new_topic/', views.new_topic, name='new_topic'),
# 用于添加新条目的页面
path('new_entry/<int:topic_id>', views.new_entry, name='new_entry'),
]
再来创建函数
from django.shortcuts import render
from django.http import HttpResponseRedirect
from django.urls import reverse
from .models import Topic
from .forms import TopicForm, EntryForm
# Create your views here.
def index(request):
"""学习笔记的主页"""
return render(request, 'learning_logs/index.html')
def topics(request):
"""显示所有主题"""
topics = Topic.objects.order_by('date_added')
# 这里定义了一个将要发送给模板的上下文,是一个字典,其中的键在模板中将用来访问数据
context = {'topics': topics}
return render(request, 'learning_logs/topics.html', context)
def topic(request, topic_id):
"""显示单个主题及其所有的条目"""
topic = Topic.objects.get(id=topic_id)
# date_added前边的减号是按降序排列的意思
entries = topic.entry_set.order_by('-date_added')
context = {'topic': topic, 'entries': entries}
return render(request, 'learning_logs/topic.html', context)
def new_topic(request):
"""添加新主题"""
if request.method != 'POST':
# 未提交数据:创建一个新表单,说明是刚打开页面供客户输入,请求一个空表单
form = TopicForm()
else:
# POST提交的数据,对数据进行处理
form = TopicForm(request.POST)
if form.is_valid():
form.save()
return HttpResponseRedirect(reverse('learning_logs:topics'))
context = {'form': form}
return render(request, 'learning_logs/new_topic.html', context)
def new_entry(request, topic_id):
"""在特定的主题中添加新条目"""
topic = Topic.objects.get(id=topic_id)
if request.method != 'POST':
# 未提交数据,创建一个空表单
form = EntryForm()
else:
# 提交数据就对其进行处理
form = EntryForm(data=request.POST)
if form.is_valid():
new_entry = form.save(commit=False)
new_entry.topic = topic
new_entry.save()
return HttpResponseRedirect(reverse('learning_logs:topic', args=[topic_id]))
context = {'topic':topic, 'form':form}
return render(request, 'learning_logs/new_entry.html', context)
还缺个可供添加条目的页面
new_entry.html
{% extends "learning_logs/base.html" %}
{% block content %}
<p><a href="{% url 'learning_logs:topic' topic.id %}">{{ topic }}</a></p>
<p>Add a new entry:</p>
<form action="{% url 'learning_logs:new_entry' topic.id %}" method='post'>
{% csrf_token %}
{{ form.as_p }}
<button name="submit">add entry</button>
</form>
{% endblock content %}
当然了也需要在topic主题页面里添加一个能够添加条目的链接
topic.html
{% extends "learning_logs/base.html" %}
{% block content %}
<p>Topic:{{ topic }}</p>
<p>Entries:</p>
<p>
<a href="{% url 'learning_logs:new_entry' topic.id %}">add new entry</a>
</p>
<ul>
{% for entry in entries %}
<li>
<p>{{ entry.date_added|date:'M d, Y H:i' }}</p>
<!--linebreaks将包含换行符的长条目转换为浏览器能够理解的格式,以免显示为一个不间断的文本块-->
<p>{{ entry.text|linebreaks }}</p>
</li>
{% empty %}
<li>There are no entries for this topic yet.</li>
{% endfor %}
</ul>
{% endblock content %}
接下来再来个编辑已有条目的功能,就是修改
先配置路径urls.py
"""定义learning_logs的URL模式"""
from django.urls import path
from . import views
urlpatterns = [
# 主页
path('', views.index, name='index'),
# 显示所有的主题
path('topics/', views.topics, name='topics'),
# 特定主题的详细页面
path('topics/<int:topic_id>/', views.topic, name='topic'),
# 用于添加新主题的网页
path('new_topic/', views.new_topic, name='new_topic'),
# 用于添加新条目的页面
path('new_entry/<int:topic_id>', views.new_entry, name='new_entry'),
# 用于编辑修改条目的页面
path('edit_entry/<int:entry_id>', views.edit_entry, name='edit_entry'),
]
添加函数views.py
from django.shortcuts import render
from django.http import HttpResponseRedirect
from django.urls import reverse
from .models import Topic
from .forms import TopicForm, EntryForm
# Create your views here.
def index(request):
"""学习笔记的主页"""
return render(request, 'learning_logs/index.html')
def topics(request):
"""显示所有主题"""
topics = Topic.objects.order_by('date_added')
# 这里定义了一个将要发送给模板的上下文,是一个字典,其中的键在模板中将用来访问数据
context = {'topics': topics}
return render(request, 'learning_logs/topics.html', context)
def topic(request, topic_id):
"""显示单个主题及其所有的条目"""
topic = Topic.objects.get(id=topic_id)
# date_added前边的减号是按降序排列的意思
entries = topic.entry_set.order_by('-date_added')
context = {'topic': topic, 'entries': entries}
return render(request, 'learning_logs/topic.html', context)
def new_topic(request):
"""添加新主题"""
if request.method != 'POST':
# 未提交数据:创建一个新表单,说明是刚打开页面供客户输入,请求一个空表单
form = TopicForm()
else:
# POST提交的数据,对数据进行处理
form = TopicForm(request.POST)
if form.is_valid():
form.save()
return HttpResponseRedirect(reverse('learning_logs:topics'))
context = {'form': form}
return render(request, 'learning_logs/new_topic.html', context)
def new_entry(request, topic_id):
"""在特定的主题中添加新条目"""
topic = Topic.objects.get(id=topic_id)
if request.method != 'POST':
# 未提交数据,创建一个空表单
form = EntryForm()
else:
# 提交数据就对其进行处理
form = EntryForm(data=request.POST)
if form.is_valid():
new_entry = form.save(commit=False)
new_entry.topic = topic
new_entry.save()
return HttpResponseRedirect(reverse('learning_logs:topic', args=[topic_id]))
context = {'topic': topic, 'form': form}
return render(request, 'learning_logs/new_entry.html', context)
def edit_entry(request, entry_id):
"""编辑既有条目"""
entry = Entry.objects.get(id=entry_id)
topic = entry.topic
if request.method != 'POST':
# 初次请求使用当前条目填充表单
form = EntryForm(instance=entry)
else:
# POST提交的数据,需要进行处理
form = EntryForm(instance=entry, data=request.POST)
if form.is_valid():
form.save()
return HttpResponseRedirect(reverse('learning_logs:topic', args=[topic.id]))
context = {'entry':entry, 'topic': topic, 'form': form}
return render(request, 'learning_logs/edit_entry.html', context)
哎呀,实在不愿意写了,后边的用户管理什么的,没什么太大区别,就不写了,大家有想看的自己去看“python编程从入门到实践”这本书第二十章附近就能接着我这个了。。。。。嘿嘿,我看点别的去了