用django创建一个简单的sns

1.首先创建一个工程newsns

django-admin.py startproject newsns

在工程目录下新建一个文件夹templates,在settings.py文件中对该模版路径进行配置:

 1 import os
 2 
 3 ROOT_DIR = os.getcwd()
 4 
 5 
 6 TEMPLATE_DIRS = (
 7     # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".
 8     # Always use forward slashes, even on Windows.
 9     # Don't forget to use absolute paths, not relative paths.
10     ROOT_DIR + '/templates/',
11 )

然后在templates文件夹下创建一个模版index.html:

<title>newsns -by django</title>
<h1><font color=#{{color}}>Django, my first django program.</font></h1>

参照上篇文章中创建模版的方法,将app目录下的settings.py文件、views.py文件和urls.py文件进行相应设置。

2.创建数据库,配置数据

在app目录下的settings.py中进行如下设置

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
        'NAME': 'newsns',                      # Or path to database file if using sqlite3.
        'USER': 'root',                      # Not used with sqlite3.
        'PASSWORD': '***',                  #密码.
        'HOST': 'localhost',                      # Set to empty string for localhost. Not used with sqlite3.
        'PORT': '',                      # Set to empty string for default. Not used with sqlite3.
    }
}

增加app newsns:

 1 INSTALLED_APPS = (
 2     'django.contrib.auth',
 3     'django.contrib.contenttypes',
 4     'django.contrib.sessions',
 5     'django.contrib.sites',
 6     'django.contrib.messages',
 7     'django.contrib.staticfiles',
 8     # Uncomment the next line to enable the admin:
 9     # 'django.contrib.admin',
10     # Uncomment the next line to enable admin documentation:
11     # 'django.contrib.admindocs',
12     'newsns',
13 )

在控制台中使用mysql命令创建数据库newsns

mysql> create database newsns default character set utf8 collate utf8_general_ci;
Query OK, 1 row affected (0.03 sec)

然后在app目录下创建一个models.py文件,该文件创建了3个类,实际上每个类代表一个表格,类的字段为表的字段。

 1 #coding:utf-8
 2 
 3 from django.db import models
 4 
 5 class newsns(models.Model):
 6     name = models.CharField(max_length = 30)
 7     content = models.CharField(max_length = 140)
 8 
 9 #以下代码可以不要
10 class Publisher(models.Model):
11     name = models.CharField(max_length=30)
12     address = models.CharField(max_length=50)
13     city = models.CharField(max_length=60)
14     state_province = models.CharField(max_length=30)
15     country = models.CharField(max_length=50)
16     website = models.URLField()
17 
18 class Author(models.Model):
19     first_name = models.CharField(max_length=30)
20     last_name = models.CharField(max_length=40)
21     email = models.EmailField()
22 
23 class Book(models.Model):
24     title = models.CharField(max_length=100)
25     authors = models.ManyToManyField(Author)
26     publisher = models.ForeignKey(Publisher)
27     publication_date = models.DateField()
在控制台输入以下命令,按照要求输入帐号、密码,建立上述表格: 
***@Android:~/newsns# python manage.py validate
0 errors found
***@Android:~/newsns# python manage.py syncdb

创建好表格后我们在manage.py shell中进行测试:

 1 ***@Android:~/newsns# python manage.py shell
 2 Python 2.7.3 (default, Aug  1 2012, 05:14:39) 
 3 Type "copyright", "credits" or "license" for more information.
 4 
 5 IPython 0.13.1 -- An enhanced Interactive Python.
 6 ?         -> Introduction and overview of IPython's features.
 7 %quickref -> Quick reference.
 8 help      -> Python's own help system.
 9 object?   -> Details about 'object', use 'object??' for extra details.
10 
11 In [1]: from newsns.models import Publisher
12 
13 In [2]: p = Publisher(name = 'Jim', city = 'beijing')
14 
15 In [3]: p.save()
16 
17 In [4]: l = Publisher.objects.all()
18 
19 In [5]: for n in l:
20    ...:     print n.name
21    ...:     
22 Jim

好了,测试无误。

3.创建表单

在app目录下创建forms.py文件,内容和models.py呼应。

1 #coding:utf-8
2 
3 from django import forms
4 
5 class snsform(forms.Form):
6         name = forms.CharField(label = "姓名")
7         content = forms.CharField(label = "内容", widget = forms.Textarea)

在views.py中添加下述代码:

 1 def home(request):
 2         if request.method == 'POST':
 3                 data = newsns()
 4                 for i in request.POST.keys():
 5                         if hasattr(data, i):
 6                                 setattr(data, i, request.POST[i])
 7                 data.save()
 8         f = snsform()
 9         ls = newsns.objects.all()
10         return render_to_response("home.html", {"ls":ls, "f":f}, context_instance = RequestContext(request))

注意要添加引入模块

#coding:utf-8
from django.http import HttpResponse
from django.template import Template, Context
from django.shortcuts import render_to_response, redirect
from mysns.models import newsns
from django.template import RequestContext
from mysns.forms import snsform

在templates目录下创建default文件夹,在该文件夹下建立一个layout.html文件,添加如下代码:

 1 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 2 <link rel="stylesheet" type="text/css" href="/static/bootstrap/css/bootstrap.min.css">
 3 <div class="navbar navbar-fixed-top">
 4   <div class="navbar-inner">
 5     <div class="container-fluid">
 6       <a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
 7         <span class="icon-bar"></span>
 8         <span class="icon-bar"></span>
 9         <span class="icon-bar"></span>
10       </a>
11       <a class="brand" href="#">Uliweb Zone</a>
12       <div class="nav-collapse">
13 
14 <ul class="nav">
15 
16 <li><a href="/"><span>首页</span></a></li><li><a href="/forum"><span>论坛</span></a></li><li class="active"><a href="/tutorial"><span>教程</span></a></li><li><a href="/about"><span>关于</span></a></li>
17 
18 
19 
20 </ul>
21 
22 
23 <style>
24 #userinfo.btn-toolbar {margin-top:0;margin-bottom:0;font-size:14px;}
25 #userinfo.btn-toolbar a{vertical-align:middle;}
26 #userinfo img {
27 -webkit-border-radius: 3px;
28    -moz-border-radius: 3px;
29         border-radius: 3px;
30 }
31 #userinfo [class^="icon-"], #userinfo [class*=" icon-"], #userinfo [class^="icon-"]:hover, #userinfo [class*=" icon-"]:hover{
32     vertical-align:middle;
33     margin-bottom:3px;
34 }
35 </style>
36 
37 
38         <p class="pull-right user_info">
39             <a href="/login">登录</a> | <a href="/register">注册</a>
40         </p>
41 
42 
43       </div><!--/.nav-collapse -->
44     </div>
45   </div>
46 </div>
47 <div style= 'padding:50px 5px 15px 20px;'>
48 {% block content %}
49 {% endblock %}
50 </div>

然后再创建一个home.html文件,添加代码

{% extends 'default/layout.html' %}
{% block content %}
<form action = "" method = "post">
        {% csrf_token %}
        <table>
                {{f}}
        </table>
        <input type="submit" value="发送" class = 'btn btn-info'>
</form>

<hr>
{%for i in ls%}
<li>{{i.content}}<a class='btn' href = '/delete?id={{i.id}}'>删除</a><a class = 'btn' href = '/edit?id={{i.id}}'>编辑</a></li>
{%endfor%}
</hr>

{% endblock %}

 layout.html文件中的

{% block content %}
{% endblock %}

表示home.html中{% block content %}与{% endblock %}之间的代码。

接下来在urls.py文件中添加url匹配

(r'^home', home),

注意要导入home函数。

我们还需要在views.py文件中实现编辑和删除功能。

编辑功能的实现思路是:获取需要编辑的帖子的id,根据该id从数据库中读取内容,在编辑页面edit.html中显示,让用户对内容进行修改,用户修改后进行post提交,根据id保存至数据库,id为原来的id,即id = int(request.GET['id'])。

删除功能的实现思路是:读取需要删除的帖子的id,根据该id从数据库中读取内容,将其删除。具体实现代码为:

 1 def delete(request):
 2         if 'id' in request.GET:
 3                 id = int(request.GET['id'])
 4                 delcontent = newsns.objects.get(id = id)
 5                 delcontent.delete()
 6         return redirect('/home')
 7 
 8 def edit(request):
 9         if request.method == 'GET':
10                 if 'id' in request.GET:
11                         ls = newsns.objects.get(id = int(request.GET['id']))
12                         f = snsform(data = {'name':ls.name, 'content':ls.content})
13                         return render_to_response("edit.html", {"f":f}, context_instance = RequestContext(request))
14         if request.method == 'POST':
15                 data = newsns.objects.get(id = int(request.GET['id']))
16                 for i in request.POST.keys():
17                         if hasattr(data, i):
18                                 setattr(data, i, request.POST[i])
19                 data.save()

现在我们还需要在模版目录下创建edit.html文件:

 1 {%extends 'default/layout.html' %}
 2 {% block content %}
 3 <form action = "" method = "post">
 4         {% csrf_token %}
 5         <table>
 6                 {{f}}
 7         </table>
 8         <input type="submit" value="发送" class = 'btn btn-info'>
 9 </form>
10 
11 <hr>
12 {%for i in ls%}
13 <li>{{i.content}}
14 {%endfor%}
15 </hr>
16 
17 {% endblock %}

浏览器中输入http://127.0.0.1:8000/home,打开便是一个具备基本增删改查功能的sns了。

 

 

posted @ 2013-07-31 23:35  bamb00  阅读(2018)  评论(2编辑  收藏  举报