在Python的Django框架中实现Hacker News的一些功能

逐步指示

这是提供给更喜欢阅读的人的视频文本版本。我们将创建一个类似黑客新闻Reddit的社交新闻网站。它将被称为“钢铁传闻”,作为一个分享关于“钢铁侠”的有趣传闻和对其进行投票的地方。

屏幕录像第一部分的概述:

  • 目标
  • 虚拟环境- 从零开始!
  • 模型管理 - 梦想的工作 #78
  • 基本的模板
  • 通用视图 - 新闻列表视图和 新闻细节视图
  • 分页-免费!!

设置虚拟环境

我们将用virtualenvvirtualenvwrapper来建立一个虚拟开发环境。首先请确认你已经安装了它们:

mkvirtualenv djangorocks

我在屏幕录像中使用的是一个叫Xubuntu的变种Ubuntu系统。但你应该能够在其他的操作系统以最小的改变重复这些步骤。

安装 Django (请确认你已经安装了pip):

  pip install Django==1.5

你也可以使用 Django 1.5.1. 这些方法和代码在最新的 Django 版本中没有测试过能否工作,所以最好按照本教程使用的版本来学习。

创建工程和应用

创建一个名为steelrumors的工程:
 

代码如下:

cd ~/projects
    django-admin.py startproject steelrumors
    cd steelrumors
    chmod +x manage.py

在你喜爱的编辑器中打开steelrumors/settings.py文件。定位和改变下列内容 (改变用粗体显示):
       

代码如下:

'ENGINE': 'django.db.backends.sqlite3'
        'NAME': 'database.db',

最后 INSTALLED_APPS = ( 'django.contrib.admin',

接下来,修改steelrumors/urls.py,取消下列行的注释:

from django.contrib import admin
  admin.autodiscover()

  urlpatterns = patterns('',
    url(r'^admin/', include(admin.site.urls)),
  )

同步创建管理对象并进入管理详细资料:

 ./manage.py syncdb

打开一个新标签或一个新终端并保持服务器实例在运行(不要忘了在这个终端上发布可工作的djangorocks):

  ./manage.py runserver

访问管理页 (一般是 http://127.0.0.1:8000/admin/) 并登录.

创建链接应用:

  ./manage.py startapp links

输入下面两个模型类到links/models.py文件中:

 from django.db import models
  from django.contrib.auth.models import User

  class Link(models.Model):
    title = models.CharField("Headline", max_length=100)
    submitter = models.ForeignKey(User)
    submitted_on = models.DateTimeField(auto_now_add=True)
    rank_score = models.FloatField(default=0.0)
    url = models.URLField("URL", max_length=250, blank=True)
    description = models.TextField(blank=True)

    def __unicode__(self):
      return self.title

  class Vote(models.Model):
    voter = models.ForeignKey(User)
    link = models.ForeignKey(Link)

    def __unicode__(self):
      return "%s upvoted %s" % (self.voter.username, self.link.title)

建立相应的管理类。输入下面内容到 links/admin.py 中:

 from django.contrib import admin
  from .models import Link, Vote

  class LinkAdmin(admin.ModelAdmin): pass
  admin.site.register(Link, LinkAdmin)

  class VoteAdmin(admin.ModelAdmin): pass
  admin.site.register(Vote, VoteAdmin)

输入下面内容到links/views.py:

 from django.views.generic import ListView
  from .models import Link, Vote

  class LinkListView(ListView):
    model = Link

  Insert following lines intosteelrumor/urls.py:

  from links.views import LinkListView
  ...
  urlpatterns = patterns('',
    url(r'^$', LinkListView.as_view(), name='home'),

建立一个新的模板文件夹,在steelrumors/templates/links/link_list.html中输入下面内容:

<ol>
  {% for link in object_list %}
    <li>
    <a href="{{ link.url }}">
     <b>{{ link.title }}</b>
    </a>
    </li>
  {% endfor %}
  </ol>

编辑settings.py,添加你的两个应用到INSTALLED_APPS = (的尾部:

  'links',
  'steelrumors',
  )

同步建立链接对象,并在管理界面里输入一些数据:

  ./manage.py syncdb

 添加品牌

建立一个通用基本模板steelrumors/templates/base.html:

 <html>
  <body>
  <h1>Steel Rumors</h1>

  {% block content %}
  {% endblock %}

  </body>
  </html>

修改steelrumors/templates/links/link_list.html,用这种方式把原先代码包裹起来:


  {% extends "base.html" %}

  {% block content %}
  ...
  {% endblock %}

投票数模型管理器

我们需要在我们的通用ListView中添加一个计票数。添加这些到 links/models.py:

  from django.db.models import Count

  class LinkVoteCountManager(models.Manager):
    def get_query_set(self):
      return super(LinkVoteCountManager, self).get_query_set().annotate(
        votes=Count('vote')).order_by('-votes')

  Insert these two lines into the Link class inlinks/models.py:

  class Link(models.Model):
  ...

    with_votes = LinkVoteCountManager()
    objects = models.Manager() #default manager

编辑 links/views.py,添加这两行到LinkListView类中:

 class LinkListView(ListView):
  ...

    queryset = Link.with_votes.all()
    paginate_by = 3

狂欢(作弊)

您可以在django shell中用下面的行给随机的标题添加100个选票数:

$ ./manage.py shell
>>> from links.models import Link
>>> for i in xrange(100): Vote(link=Link.objects.order_by('?')[0],voter=a).save()

最终评论

或许你想知道这个网站的这个版本是否有用,我想说,它作为私人测试版是工作不错的。任何新用户都必须通过管理界面手动添加。如果想让他们登陆管理界面,他们必须是员工。员工可以通过手动创建投票对象来进行投票。

站点面向大众的部分仍能显示来自员工投票率最高的传闻。基于如何设计好的模板的问题,这个版本也可以用来获取对网站的设计和品牌的反馈。

总结完第一部分。想得到随后部分的更新,请在Twitter上粉我一个@arocks。

(0)

相关推荐

  • 详解Python中的__new__、__init__、__call__三个特殊方法

    __new__: 对象的创建,是一个静态方法,第一个参数是cls.(想想也是,不可能是self,对象还没创建,哪来的self) __init__ : 对象的初始化, 是一个实例方法,第一个参数是self. __call__ : 对象可call,注意不是类,是对象. 先有创建,才有初始化.即先__new__,而后__init__. 上面说的不好理解,看例子. 1.对于__new__ class Bar(object): pass class Foo(object): def __new__(cls

  • Python中__new__与__init__方法的区别详解

    在python2.x中,从object继承得来的类称为新式类(如class A(object))不从object继承得来的类称为经典类(如class A()) 新式类跟经典类的差别主要是以下几点: 1. 新式类对象可以直接通过__class__属性获取自身类型:type 2. 继承搜索的顺序发生了改变,经典类多继承时属性搜索顺序: 先深入继承树左侧,再返回,开始找右侧(即深度优先搜索);新式类多继承属性搜索顺序: 先水平搜索,然后再向上移动 例子: 经典类: 搜索顺序是(D,B,A,C) >>

  • Python中__init__和__new__的区别详解

    __init__ 方法是什么? 使用Python写过面向对象的代码的同学,可能对 __init__ 方法已经非常熟悉了,__init__ 方法通常用在初始化一个类实例的时候.例如: # -*- coding: utf-8 -*- class Person(object): """Silly Person""" def __init__(self, name, age): self.name = name self.age = age def __

  • 详解Python中的__new__()方法的使用

    先看下object类中对__new__()方法的定义: class object: @staticmethod # known case of __new__ def __new__(cls, *more): # known special case of object.__new__ """ T.__new__(S, ...) -> a new object with type S, a subtype of T """ pass obj

  • 详解Python中的__init__和__new__

    一.__init__ 方法是什么?使用Python写过面向对象的代码的同学,可能对 __init__ 方法已经非常熟悉了,__init__ 方法通常用在初始化一个类实例的时候.例如: 复制代码 代码如下: # -*- coding: utf-8 -*- class Person(object):    """Silly Person""" def __init__(self, name, age):        self.name = name

  • Python中的__new__与__init__魔术方法理解笔记

    很喜欢Python这门语言.在看过语法后学习了Django 这个 Web 开发框架.算是对 Python 有些熟悉了.不过对里面很多东西还是不知道,因为用的少.今天学习了两个魔术方法:__new__ 和 __init__. 开攻: 如果对 Python 有所简单了解的话应该知道它包含类这个概念的.语法如下: 复制代码 代码如下: class ClassName:     <statement - 1>:         .         .           .     <state

  • python中的__init__ 、__new__、__call__小结

    1.__new__(cls, *args, **kwargs)  创建对象时调用,返回当前对象的一个实例;注意:这里的第一个参数是cls即class本身2.__init__(self, *args, **kwargs) 创建完对象后调用,对当前对象的实例的一些初始化,无返回值,即在调用__new__之后,根据返回的实例初始化:注意,这里的第一个参数是self即对象本身[注意和new的区别]3.__call__(self,  *args, **kwargs) 如果类实现了这个方法,相当于把这个类型

  • 实例解析Python中的__new__特殊方法

    __new__ 方法是什么? 如果将类比喻为工厂,那么__init__()方法则是该工厂的生产工人,__init__()方法接受的初始化参 数则是生产所需原料,__init__()方法会按照方法中的语句负责将原料加工成实例以供工厂出货.而 __new__()则是生产部经理,__new__()方法可以决定是否将原料提供给该生产部工人,同时它还决定着出 货产品是否为该生产部的产品,因为这名经理可以借该工厂的名义向客户出售完全不是该工厂的产品. __new__()方法的特性: 1.__new__()方

  • 在Python的Django框架中实现Hacker News的一些功能

    逐步指示 这是提供给更喜欢阅读的人的视频文本版本.我们将创建一个类似黑客新闻 或Reddit的社交新闻网站.它将被称为"钢铁传闻",作为一个分享关于"钢铁侠"的有趣传闻和对其进行投票的地方. 屏幕录像第一部分的概述: 目标 虚拟环境- 从零开始! 模型管理 - 梦想的工作 #78 基本的模板 通用视图 - 新闻列表视图和 新闻细节视图 分页-免费!! 设置虚拟环境 我们将用virtualenv和 virtualenvwrapper来建立一个虚拟开发环境.首先请确认你

  • Python的Django框架中的Context使用

    一旦你创建一个 Template 对象,你可以用 context 来传递数据给它. 一个context是一系列变量和它们值的集合. context在Django里表现为 Context 类,在 django.template 模块里. 她的构造函数带有一个可选的参数: 一个字典映射变量和它们的值. 调用 Template 对象 的 render() 方法并传递context来填充模板: >>> from django.template import Context, Template &

  • 在Python的Django框架中加载模版的方法

    为了减少模板加载调用过程及模板本身的冗余代码,Django 提供了一种使用方便且功能强大的 API ,用于从磁盘中加载模板, 要使用此模板加载API,首先你必须将模板的保存位置告诉框架. 设置的保存文件就是settings.py. 如果你是一步步跟随我们学习过来的,马上打开你的settings.py配置文件,找到TEMPLATE_DIRS这项设置吧. 它的默认设置是一个空元组(tuple),加上一些自动生成的注释. TEMPLATE_DIRS = ( # Put strings here, li

  • 在Python的Django框架中创建和使用模版

    如何使用模板系统 让我们深入研究模板系统,你将会明白它是如何工作的.但我们暂不打算将它与先前创建的视图结合在一起,因为我们现在的目的是了解它是如何独立工作的. . (换言之, 通常你会将模板和视图一起使用,但是我们只是想突出模板系统是一个Python库,你可以在任何地方使用它,而不仅仅是在Django视图中.) 在Python代码中使用Django模板的最基本方式如下: 可以用原始的模板代码字符串创建一个 Template 对象, Django同样支持用指定模板文件路径的方式来创建 Templa

  • 全面剖析Python的Django框架中的项目部署技巧第1/2页

    项目开始时是一个关键时刻,选择会对项目产生长期的影响.有很多关于如何开始使用Django框架的教程,但很少讨论如何专业地使用Django,或如何使用行业公认的最佳做法来确保你的项目规模的持续增长.事前的筹划让你(和所有同事的生活)在走向将来时更容易. 文章结束时,你将有 一个全功能的Django 1.6项目 源代码受控的所有资源(使用Git或Mercurial) 自动回归和单元测试(使用unittest库) 一个独立于特定环境的安装项目(使用virtualenv) 自动化的部署和测试(使用Fab

  • Python的Django框架中if标签的相关使用

    {% if %} 标签检查(evaluate)一个变量,如果这个变量为真(即,变量存在,非空,不是布尔值假),系统会显示在 {% if %} 和 {% endif %} 之间的任何内容,例如: {% if today_is_weekend %} <p>Welcome to the weekend!</p> {% endif %} {% else %} 标签是可选的: {% if today_is_weekend %} <p>Welcome to the weekend!

  • 在Python的Django框架中为代码添加注释的方法

    就像HTML或者Python,Django模板语言同样提供代码注释. 注释使用 {# #} : {# This is a comment #} 注释的内容不会在模板渲染时输出. 用这种语法的注释不能跨越多行. 这个限制是为了提高模板解析的性能. 在下面这个模板中,输出结果和模板本身是 完全一样的(也就是说,注释标签并没有被解析为注释): This is a {# this is not a comment #} test. 如果要实现多行注释,可以使用`` {% comment %}`` 模板标

  • 详解在Python的Django框架中创建模板库的方法

    不管是写自定义标签还是过滤器,第一件要做的事是创建模板库(Django能够导入的基本结构). 创建一个模板库分两步走: 第一,决定模板库应该放在哪个Django应用下. 如果你通过 manage.py startapp 创建了一个应用,你可以把它放在那里,或者你可以为模板库单独创建一个应用. 我们更推荐使用后者,因为你的filter可能在后来的工程中有用. 无论你采用何种方式,请确保把你的应用添加到 INSTALLED_APPS 中. 我们稍后会解释这一点. 第二,在适当的Django应用包里创

  • 详解Python的Django框架中manage命令的使用与扩展

    [简介] django-admin.py是Django的一个用于管理任务的命令行工具.本文将描述它的大概用法. 另外,在每一个Django project中都会有一个manage.py.manage.py是对django-admin.py的简单包装,它额外帮助我们做了两件事情: 它将你的project的包放到sys.path中 它将DJANGO_SETTINGS_MODULE环境变量设置为了你的project的setting.py文件的位置. 如果你是通过setup.py工具来安装Django的

  • 利用Python的Django框架中的ORM建立查询API

     摘要 在这篇文章里,我将以反模式的角度来直接讨论Django的低级ORM查询方法的使用.作为一种替代方式,我们需要在包含业务逻辑的模型层建立与特定领域相关的查询API,这些在Django中做起来不是非常容易,但通过深入地了解ORM的内容原理,我将告诉你一些简捷的方式来达到这个目的. 概览 当编写Django应用程序时,我们已经习惯通过添加方法到模型里以此达到封装业务逻辑并隐藏实现细节.这种方法看起来是非常的自然,而且实际上它也用在Django的内建应用中. >>> from djang

随机推荐