python web小项目实践 用的Django (三)

这里创建一个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编程从入门到实践”这本书第二十章附近就能接着我这个了。。。。。嘿嘿,我看点别的去了

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值