python编程从入门到实践 第十九章课后答案 19-1

平台 pycharm   python3.6   Django 1.8.5

各文件夹的设置均按照课本的要求执行,项目代码如下:

Blog/urls.py

from django.conf.urls import include, url
from django.contrib import admin

urlpatterns = [
    url(r'^admin/', include(admin.site.urls)),
    url(r'',include('blogs.urls',namespace='blogs'))
]

Blog/settings.py 的INSTALLED_APP代码中加入‘blogs’

blogs/admin.py 

from django.contrib import admin
from blogs.models import BlogPost

# Register your models here.
admin.site.register(BlogPost)

blogs/models.py

from django.db import models


# Create your models here.
class BlogPost(models.Model):
	title = models.CharField(max_length=100)
	text = models.TextField()
	date_added = models.DateTimeField(auto_now_add=True)

	def __str__(self):
		return self.title

blogs/urls.py

from django.conf.urls import url
from . import views

urlpatterns=[
	url(r'^$',views.index,name='index'),
	url(r'^topics/$',views.topics,name='topics'),
	url(r'^new_blog$',views.new_blog,name='new_blog'),
	url(r'^edit_blog/(?P<blog_id>\d+)$',views.edit_blog,name='edit_blog'),
]

blogs/views.py

from django.shortcuts import render
from django.http import HttpResponseRedirect
from django.core.urlresolvers import reverse


# Create your views here.
from .models import BlogPost
from .forms import BlogPostForm

def index(request):
	return render(request, 'blogs/index.html')


def topics(request):
	topics = BlogPost.objects.order_by('date_added')
	context = {'topics': topics}
	return render(request, 'blogs/topics.html', context)

def new_blog(request):
	if request.method!='POST':
		form=BlogPostForm()
	else:
		form=BlogPostForm(request.POST)
		if form.is_valid():
			form.save()
			return HttpResponseRedirect(reverse('blogs:topics'))
	context={'form':form}
	return  render(request,'blogs/new_blog.html',context)


def edit_blog(request,blog_id):
	blog=BlogPost.objects.get(id=blog_id)
	if request.method!='POST':
		form=BlogPostForm(instance=blog)
		#括号中缺少instance=blog会使edit blog时文本框空白
	else:
		form=BlogPostForm(instance=blog,data=request.POST)
		if form.is_valid():
			form.save()
			return HttpResponseRedirect(reverse('blogs:topics'))
	context={'blog':blog,'form':form}
	return render(request,'blogs/edit_blog.html',context)

blogs/forms.py

from django import forms
from .models import BlogPost


class BlogPostForm(forms.ModelForm):
	class Meta:
		model=BlogPost
		fields=['title','text']
		labels={'title':'title','text':'text'}
		widgets={'text':forms.Textarea({'cols':80})}

templates/blogs中的html文件代码如下:

base.html

<p>
    <a href="{% url 'blogs:index' %}">BlogPost</a>-
    <a href="{% url 'blogs:topics' %}">blogs</a>   <!--如果连接后网页不正确,检查冒号后topics是否正确-->
</p>
{% block content %}{% endblock content %}

index.html

{% extends "blogs/base.html" %}
{% block content %}
    <p>write anything you want to post to others!</p>
{% endblock content %}

topics.html

{% extends "blogs/base.html" %}
{% block content %}
    <p>Blogs:</p>
    <ul>
    {% for blog in topics %}   <!--如果连接后的界面错误,检查blog和topics两个变量书写是否正确-->
        <li>
            <p>{{ blog.date_added|date:'M d,Y H:i' }}</p>
            <p>{{ blog.title }}:</p>
            <p>{{ blog.text|linebreaks }}</p>
            <p><a href="{% url 'blogs:edit_blog' blog.id%}">edit blog</a> </p>
        </li>
    {% empty %}
        <li>
            there is no blog!
        </li>
    {% endfor %}
    </ul>
    <a href="{% url 'blogs:new_blog' %}">Add a new blog:</a>

{% endblock content %}

new_blog.html

{% extends "blogs/base.html" %}
{% block content %}
    <p>Add a new blog:</p>
    <form action="{% url 'blogs:new_blog' %}" method="post">
        {% csrf_token %}
        {{ form.as_p }}
        <button name="submit">add blog</button>
    </form>
{% endblock content %}

edit_blog.html

{% extends "blogs/base.html" %}
{% block content %}
    <p>Edit blog:</p>
    <form action="{% url 'blogs:edit_blog' blog.id %}" method="post">
        {% csrf_token %}
        {{ form.as_p }}
        <button name="submit">save changes</button>
    </form>
{% endblock content %}

完成后的运行界面如下:




猜你喜欢

转载自blog.csdn.net/weixin_41982136/article/details/80366717