发几乎个朋友啊准备跳入创业火坑了,找到自己说帮做做产品分析与方向讨论,欣然答应。

2.6 第一个DJango app,Part 4:表单和泛型视图

按有关键介绍form表单相关。

简言之来说,频次超低的、离钱多之、交互(人人、人机)弱的idea,应该好反思。

目录

2.5 第一单Django app,Part 3:视图和模板

  • 2.5.1 概览
  • 2.5.2 编写更多之视图
  • 2.5.3 编写能实际干点活的视图
  • 2.5.4 404错误
  • 2.5.5 使用模板系统
  • 2.5.6 删除模板被硬编码的URLs
  • 2.5.7 URL names的命名空间

2.6 第一只DJango app,Part 4:表单和泛型视图

  • 2.6.1 编写一个简短的form
  • 2.6.2 使用泛型视图:减少代码冗余

更新

——————————————————————————————————————————
与此同时达到首页NO.1了,谢谢大家之支撑,欢迎转载分享至各个地方,但请保留”许同一几“的名字。

PS。赞数和粉丝数不成比例啊。。”本文完全原创,每一个配都是深夜点火揉眼咬嘴唇独自敲起!“,加上这句话会不见面关切的人数多一些?哈哈:)

迎大家看我之个人网站《刘江的博客和课程》:www.liujiangblog.com

  • 万一想做只特定话题的兴味社区,其实可以于豆瓣、贴吧等兴趣小组开始尝试运营。
  • 而你想做一个传媒,其实乃可以打微信、简书等开始营业,看看大家照面无会见善上而。
  • 一经您想试大家发出无发按物品交换的求,做个公号、Wordpress就会募集用户要求了。

2.5.5 使用模板系统

回去detail()视图。将上下文变量question传递给相应的html模板,它看起如下所示:

polls/templates/polls/detail.html

<h1>{{ question.question_text }}</h1>
<ul>
{% for choice in question.choice_set.all %}
    <li>{{ choice.choice_text }}</li>
{% endfor %}
</ul>

面前我们说罢了,在模板系统受到圆点“.”是全能的魔术师,你得就此它们访问对象的特性。在例子{{
question.question_text
}}中,DJango首先会以question对象中品尝寻找一个字典,如果失败,则尝试摸属性,如果重失败,则尝试当列表的目进行询问。

于 {% for %}
循环中之办法调用——poll.choice_set.all其实就是Python的代码poll.choice_set.all(),它将返回一组而迭代的
Choice 对象,并因此当 {% for %} 标签中。

再也多内容请查看3.5节省的模板向导!

我清楚所谓精益,是以频频小步测试和推翻中探索产品,其实论证绝大多数底idea,APP都无是必要环节。

2.5.3 编写能实际干点活的视图

面前我们说了,每个视图至少做简单项事某:返回一个分包呼吁页面的HttpResponse对象要弹来一个接近Http404底慌。其它的尽管以你就算,你容易关系嘛干嘛。

您的视图可以由数据库读取记录,或者不念。你可以使Django提供的沙盘系统或第三着的Python模板系统,或者简直啥也不用。你可以生成PDF文件、输出XML,创建ZIP压缩文件,任何你想做的从,使用任意而想就此的Python库。

假若Django想要之只有HttpResponse或者一个怪。

为如此不行轻便,接下为我们以DJango自己的数据库API,我们当面的教程里介绍了之。下面是一个新的index()视图,它会依据发表日期显示最近底5独投票问卷,通过逗号分隔。

polls/views.py

from django.http import HttpResponse
from .models import Question

def index(request):
    latest_question_list = Question.objects.order_by('-pub_date')[:5]
    output = ', '.join([q.question_text for q in latest_question_list])
    return HttpResponse(output)

# 下面是那些没改动过的视图(detail, results, vote)

不过此间依旧发生只问题:在视图中之页面时硬编码的。如果你想改变页面的展示,就得修改这里的Python代码。因此,让咱来运Django提供的模版系统,解耦视图和模板之间的沟通。

率先,在polls目录下创造一个新的templates目录,Django会在它们里面找模板文件。

此处解释一下:Django项目之settings配置文件被定义了哪些加载与渲染模板。默认的装
是DjangoTemplates后端,并且APP_DIRS参数为装置也True。作为老,Django也会见找每个在INSTALLED_APPS配置项里注册了的app本身目录下的templates子目录。

回到你刚才创建的templates目录中,再创一个初的子目录名叫polls,进入该子目录,创建一个新的html文件index.html。换句话说,你的模版文件应该是polls/templates/polls/index.html。根据地方的讲,你本好当DJango中直接以polls/index.html引用该公文了。

模板命名空间:
你也许会想,为什么不把模板文件直接放在polls/templates目录下,而是费劲的再建个子目录polls呢?设想这么个情况,有另外一个app,它也有一个名叫index.html的文件,当Django在搜索模板时,有可能就找到它,然后退出搜索,这就命中了错误的目标,不是我们想要的结果。解决这个问题的最好办法就是在templates目录下再建立一个与app同名的子目录,将自己所属的模板都放到里面,从而达到独立命名空间的作用,不会再出现引用错误。

兹,将下列代码写副文件:
polls/templates/polls/index.html

{% if latest_question_list %}
    <ul>
    {% for question in latest_question_list %}
    <li><a href="/polls/{{ question.id }}/">{{ question.question_text }}</a></li>
    {% endfor %}
    </ul>
{% else %}
    <p>No polls are available.</p>
{% endif %}

同时,修改视图文件,让新的index.html文件生效:
polls/views.py

from django.http import HttpResponse
from django.template import loader
from .models import Question

def index(request):
    latest_question_list = Question.objects.order_by('-pub_date')[:5]
    template = loader.get_template('polls/index.html')
    context = {
    'latest_question_list': latest_question_list,
    }
    return HttpResponse(template.render(context, request))

地方的代码会加载polls?index.html文件,并传递让其一个参数,这个参数是一个字典,包含了模版变量名和python对象期间的炫耀关系。

当浏览器中通过访问“/polls/”,你得见见一个列表,包含“What’s
up”的问卷,以及连接至该针对性许详细内容页面的链接点。

快捷方式:render()

在实际用中,加载模板、传递参数,返回HttpResponse对象是身再常用但的操作了,为了省力气,Django提供了一个快捷方式:render函数,一步到位!看如下代码:

polls/views.py

from django.shortcuts import render
from .models import Question
def index(request):
    latest_question_list = Question.objects.order_by('-pub_date')[:5]
    context = {'latest_question_list': latest_question_list}
    return render(request, 'polls/index.html', context)

render()函数的首先个职务参数是请求对象(就是view函数的第一只参数),第二只岗位参数是模板,还足以生一个可选的老三参数—一个字典,包含需要传递让模板的多少。最后render函数返回一个由此字典数据渲染了的沙盘封装而改为的HttpResponse对象。

故而请求考虑一个题材:
“如果想论证自己的idea可行性,一定得决定要通过独立APP来证明吗?”

2.5.6 删除模板被硬编码的URLs

以polls/index.html文件中,还有有硬编码存在,也不怕是herf里的“/polls/”部分:

<li><a href="/polls/{{ question.id }}/">{{ question.question_text }}</a></li>

里头的紧耦合对于代码修改好不利。
但是,我们前为urls定义了一个name别名,可以据此其来替代。具体代码如下:

<li><a href="{% url 'detail' question.id %}">{{ question.question_text }}</a></li>

Django会在polls.urls文件被搜索name=’detail’的url,具体的虽是脚这行:

url(r'^(?P<question_id>[0-9]+)/$', views.detail, name='detail'),

选个栗子,如果您想用polls的detail视图的URL更换为polls/specifics/12/,那么您不待以模板被重新修改url地址了,仅仅不过待以polls/urls.py文件中,将相应的正则表达式改成为下面这样的虽实施了:

# 添加新的单词'specifics'
url(r'^specifics/(?P<question_id>[0-9]+)/$', views.detail, name='detail'),

立刻三只必都是生产品价值的,而且本着一些用户/场景呢是疼痛极了的痛点。

2.5.4 404错误

现行给咱来修返回具体问卷文本内容之视图:

polls/views.py

from django.http import Http404
from django.shortcuts import render
from .models import Question
# ...
def detail(request, question_id):
    try:
        question = Question.objects.get(pk=question_id)
    except Question.DoesNotExist:
        raise Http404("Question does not exist")
    return render(request, 'polls/detail.html', {'question': question})

这里发生只新定义:如果请的问卷ID不存在,那么会弹有一个Http404左。

稍后咱们会谈谈你当于polls/detail.html里面写点什么代码,但是今你得省略的先写这么个东西,用来展示方面的404错误:

polls/templates/polls/detail.html

{{ question }}

快捷方式:get_object_or_404()

纵使像render函数一样,Django同样为你提供了一个偷懒的法子,替代点的多行代码,那就是是get_object_or_404()方法,参考下面的代码:

polls/views.py

from django.shortcuts import get_object_or_404, render
from .models import Question
# ...
def detail(request, question_id):
    question = get_object_or_404(Question, pk=question_id)
    return render(request, 'polls/detail.html', {'question': question})

转变说我无提醒您,和render一样,也要在Django内置的快捷方式模块中导入get_object_or_404()!

get_object_or_404()函数将一个Django模型作为第一只位置参数,后面可以同达到无限制个数的显要字参数(python函数参数的归类以及语法一定要是作明白了!这些关键字参数是传递让范管理器的get()函数的,在后边会说到。),如果目标非在则弹出Http404荒谬。

理念:
为什么要费劲的使用一个get_object_or_404()快捷方式,而不是让系统自动的捕获ObjectDoesNotExist异常或者弹出模型API的Http404异常?仅仅只是为了少写点代码?
因为后两者会耦合模型层和视图层。Django的一个非常重要的设计目标是维持各层级之间的松耦合。更多的内容请参考3.3.5节。

平,这里还有一个get_list_or_404()函数,和点的get_object_or_404()类似,只不过是因此来取代filter()函数,当查问列表为空时弹出404谬误。(filter是范API中因故来过滤查询结果的函数,它的结果是一个列表集。而get则是查询一个结实的主意,和filter是一个同多个的区分!)

有关是否应做APP,其实无论是外乎几独踏实的理:

2.6.1 编写一个简易的form

当今于咱们原先底polls/detail.html文件被补充加一个表单元素:

polls/templates/polls/detail.html

<h1>{{ question.question_text }}</h1>

{% if error_message %}<p><strong>{{ error_message }}</strong></p>{% endif %}

<form action="{% url 'polls:vote' question.id %}" method="post">
{% csrf_token %}
{% for choice in question.choice_set.all %}
    <input type="radio" name="choice" id="choice{{ forloop.counter }}" value="{{ choice.id }}" />
    <label for="choice{{ forloop.counter }}">{{ choice.choice_text }}</label><br />
{% endfor %}
<input type="submit" value="Vote" />
</form>

简简单单说明:

  • 地方的沙盘显示平层层单选按钮,按钮的价值是择的ID,按钮的名是字符串”choice”。这意味,当你选择了内部某按钮,并付诸表单,一个带有数据choice=#的POST请求将受发送到指定的url,#凡于挑的选项之ID。这就是HTML表单的基本概念。
  • 假使您发出自然之前端开发基础,那么form标签的action属性和method属性你该十分明白其的含义,action表示您如果发送的目的url,method表示提交数据的法门,一般分POST和GET,更多的讲就是未是本教程干的事体了,你得补课。
  • forloop.counter是DJango模板系统管理专门供的一个变量,用来表示你眼前循环的次数,一般用来叫循环型增长有序数标。
  • 由我们发送了一个POST请求,就得考虑一个跨站请求伪造之题目,简称CSRF(具体意思请百度)。Django为而提供了一个简的章程来避免这麻烦,那就是是以form表单内加加同长达{%
    csrf_token
    %}标签,标签名不可更改,固定格式,位置任意,只要是于form表单内。但是(译者注),这个点子对form表单的交方式方便好使,但是倘若是为此ajax的办法提交数据,那么就算挺费力了。个人觉得无苟直接当Django配置中关闭是看似产生意图,其实然并卵的CSRF得矣。

本,让咱们创建一个处理提交过来的数码的视图。前面我们已写了一个“占坑”的vote视图的url:
polls/urls.py

url(r'^(?P<question_id>[0-9]+)/vote/$', views.vote, name='vote'),

及“占坑”的vote视图函数,我们把坑填起来:
polls/views.py

from django.shortcuts import get_object_or_404, render
from django.http import HttpResponseRedirect, HttpResponse
from django.urls import reverse
from .models import Choice, Question
# ...

def vote(request, question_id):
    question = get_object_or_404(Question, pk=question_id)
    try:
        selected_choice = question.choice_set.get(pk=request.POST['choice'])
    except (KeyError, Choice.DoesNotExist):
        # 发生choice未找到异常时,重新返回表单页面,并给出提示信息
        return render(request, 'polls/detail.html', {
        'question': question,
        'error_message': "You didn't select a choice.",
        })
    else:
        selected_choice.votes += 1
        selected_choice.save()
        # 成功处理数据后,自动跳转到结果页面,防止用户连续多次提交。
        return HttpResponseRedirect(reverse('polls:results', args=(question.id,)))

稍许新的事物,我们而解释一下:

  • request.POST是一个类似字典的对象,允许你通过键名访问提交的多少。本例中,request.POST[’choice’]归来给增选选项的ID,并且值的种永远是string字符串,那恐惧它看起像数字,记住了!!!!同样的,你吧足以据此类似之伎俩取得GET请求发送过来的多寡,一个理。
  • request.POST[’choice’]发生或接触一个KeyError异常,如果您的POST数据里没有提供choice键值,在这种景象下,上面的代码会回表单页面并叫出左提示。译者注:通常咱们会吃个默认值,防止这种异常的发出,例如:request.POST[’choice’,None],一个None解决有题目。
  • 在甄选计数器加一继,返回的凡一个HttpResponseRedirect而无是先咱们常因此底HttpResponse。HttpResponseRedirect需要一个参数:重定向的URL。这里产生一个提议,当你成功拍卖POST数据后,应当保障一个良好的惯,始终返回一个HttpResponseRedirect。这不只是指向Django而言,它是一个优秀的WEB开发习惯。
  • 咱俩以点HttpResponseRedirect的构造器中行使了一个reverse()函数。它能够支援我们避免以视图函数中硬编码URL。它首先用一个我们以URLconf中指定的name,然后是传递的数量。例如’/polls/3/results/’,其中的3是某question.id的价值。重定向后拿进入’polls:results’对应之视图,并将question.id传递让它。白话来讲,就是将活扔给另外一个路由对应之视图去干。

当有人对某问题投票后,vote()视图重定向到了问卷的结果显示页面。下面我们来写是处理结果页面的视图:
polls/views.py

from django.shortcuts import get_object_or_404, render

def results(request, question_id):
    question = get_object_or_404(Question, pk=question_id)
    return render(request, 'polls/results.html', {'question': question})

一律,还亟需写个模板。(译者注:路由、视图、模板、模型!你用之套路….)

polls/templates/polls/results.html

<h1>{{ question.question_text }}</h1>
<ul>
{% for choice in question.choice_set.all %}
    <li>{{ choice.choice_text }} -- {{ choice.votes }} vote{{ choice.votes|pluralize }}</li>
{% endfor %}
</ul>
<a href="{% url 'polls:detail' question.id %}">Vote again?</a>

现行你可以收获浏览器中走访/polls/1/了,投票吧。你会视一个结果页面,每投同差,它的内容即更新一软。如果您付的时光没选择种类,则会得一个错提示。

注释:(怎么这么多注释....)
在上面的vote视图中的代码存在一点小问题。如果有2个用户同时在对某项进行提交时,很有可能发生同时对数据库进行读写的情况,它有可能导致数据的不协调,也就是所谓的“竞态”,如果你感兴趣,可以参考6.15节相关的通过使用F()查询来避免竞态的讨论和介绍。

但是呢,实现这个产品之顶尖形式,也许是同一摆流传甚广的Excel表格、也许是一个豆子小组、也许是一律摆放张公告栏的招领启事,也许是同等布置截图、也许是一个微信公号。但好惋惜,它不拖欠是APP。

2.5.1 概览

一个视图就是一个网页“类型”,通常提供一定的效用还是特定的沙盘。例如:在一个博客应用中,你恐怕会见相下列视图:

  • 博客主页:显示最新公布的片情
  • 章详细页面:每个条目对应的千古页面
  • 据悉年之章页面:显示指定年内的备博客文章
  • 依据月之文章页面:显示指定月内之有着博客文章
  • 冲天之稿子页面:显示指定日内的有博客文章
  • 发表评论:处理对某篇博客发布的评价

每当我们的投票应用中,我们用成立下面的视图:

  • 问卷“index”页:显示最新的有些问卷
  • 问卷“detail”页面:显示一个问卷的详尽文本内容,没有调查结果但是发生一个投票或调研表单。
  • 问卷“results”页面:显示有问卷的投票或调查结果。
  • 投票动作页面:处理对某个问卷的某选项之投票动作。

以Django中,网页和其它的片情都是由此视图来散发的。视图呈现吗一个简约的Python函数(在依据类的视图中称方法)。Django通过对比请求的URL地址来选相应的视图。

当您平常底网页上,你可能时时会遇见类似“ME2/Sites/dirmod.asp?sid=&type=gen&mod=Core+Pages&gid=A6CD4967199A42D9B65B1B”的url。庆幸的是Django支持用越来越简介的URL模式,而无需要编制上面那种复杂的url。

一个URL模式其实就是是一个URL通用表达式,例如:/newsarchive///。为了让URL模式映射到对应之视图,DJango使用URLconfs来完成就等同做事。本课程介绍中心的URLconfs使用办法,更多之始末,请参考6.23节。

另渠道为出个别的长处:

关键分享Python 及Django教程以及有关的博客


先是有传送门

老三局部传递门

季片传送门

3.2 模型和数据库Models and
databases

3.2.2 查询操作making
queries

3.3.8
会话sessions

罗辑思维

2.6.2 使用泛型视图:减少代码冗余

面的detail、index和results视图的代码非常相像,有硌冗余,这是一个主次猿不可知经得住的。他们还有所类似之事情逻辑,实现类似的意义:通过从URL传递过来的参数去数据库查询数据,加载一个模板,利用刚才的数量渲染模板,返回这个模板。由于是进程是如此的宽泛,Django又格外善解人意的拉扯你想方法偷懒了,它提供了一致栽快捷方式,名吧“泛型视图”系统。

今日,让咱们来尝试看以原先的代码改呢使泛型视图的不二法门,整个经过分三步走:

  • 改变URLconf
  • 删除一些本来的无效的视图
  • 利用基于泛型视图的初视图

注释:Django官方的“辩解”
缘何仍学科的代码来回改动这么累?
报:通常在写一个Django的app时,我们一致开始将控制是使用泛型视图还是不要,而休是齐及代码写及一半了才重构你的代码成泛型视图。但是以学科为了吃你清晰的解视图的内蕴,“故意”走了一如既往长比较2的路,因为我们的哲学是:在公采取计算器之前若得预亮基本的数学公式。

修改URLconf

开拓polls/urls.py文件,将其修改成下面的指南:

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

app_name = 'polls'
urlpatterns = [
    url(r'^$', views.IndexView.as_view(), name='index'),
    url(r'^(?P<pk>[0-9]+)/$', views.DetailView.as_view(), name='detail'),
    url(r'^(?P<pk>[0-9]+)/results/$', views.ResultsView.as_view(), name='results'),
    url(r'^(?P<question_id>[0-9]+)/vote/$', views.vote, name='vote'),
]

请小心:在面的底第2,3条条框框中将原本的<question_id>修改成了<pk>.

改视图

接通下去,打开polls/views.py文件,删掉index、detail和results视图,替换成Django的泛型视图,如下所示:

polls/views.py

from django.shortcuts import get_object_or_404, render
from django.http import HttpResponseRedirect
from django.urls import reverse
from django.views import generic
from .models import Choice, Question


class IndexView(generic.ListView):
    template_name = 'polls/index.html'
    context_object_name = 'latest_question_list'
    def get_queryset(self):
    """返回最近发布的5个问卷."""
        return Question.objects.order_by('-pub_date')[:5]


class DetailView(generic.DetailView):
    model = Question
    template_name = 'polls/detail.html'


class ResultsView(generic.DetailView):
    model = Question
    template_name ='polls/results.html'


def vote(request, question_id):
... # 这个视图未改变!!!

当这边,我们下了少数栽泛型视图:ListView和DetailView(译者注:它们是用作父类被持续的)。这两头分别表示“显示一个靶的列表”和“显示特定类型对象的详实页面”的抽象概念。

  • 列一样栽泛型视图都亟需知道她而作用在谁模型上,这通过model属性提供。

  • DetailView泛型视图需要从URL捕获到之名为”pk”的主键值,因此我们当url文件中将2和3修目的<question_id>改成了<pk>

默认情况下,DetailView泛型视图使用一个叫<app name>/<model name>_detail.html的模板。在本例中,实际用的是”polls/question_detail.html”。template_name属性就是用来指定这个模板名之,用于代替自动生成的默认模板名。(译者注:一定要细察看地方的代码,对号落座,注意细节。)同样的,在resutls列表视图中,为了指定template_name为’polls/results.html’,这样便管了则resulst视图和detail视图同样连续了DetailView类,使用了平的model:Qeustion,但她还是会显示不同的页面。(译者注:模板不同嘛!so
easy!)

类似的,ListView泛型视图使用一个默认模板称为<app name>/<model name>_list.html。我们也利用template_name这个变量来报ListView使用我们曾经存在的
“polls/index.html”模板,而无是应用其和谐默认的大。

在课程的前方有,我们给模板提供了一个含question和latest_question_list的上下文变量。而对于DetailView,question变量会叫电动提供,因为我们利用了Django的型(Question),Django会智能的选料适宜的上下文变量。然而,对于ListView,自动生成的上下文变量是question_list。为了掩盖其,我们提供了context_object_name属性,指定说咱们希望以latest_question_list而不是question_list。

现今若得运行开发服务器,然后试试基于泛型视图的应用程序了。
查阅更多关于泛型视图的情节,请往3.6节。

及此处,本节的始末了了,你得开始下一样聊节之读。
当博主翻译的还得尽管点赞支持一下吧!

随,你想用以下这些idea帮助你创业,达到人生巅峰,我劝你又漂亮想想:

2.5.7 URL names的命名空间

照学科例子中,只生1个app也就算是polls,但是在切切实实中深显著会生出5独、10独、更多的app同时存在一个列被。Django是哪区分这些app之间的URL
name呢?

答案是利用URLconf的命名空间。在polls/urls.py文件之开部分,添加一个app_name的变量来指定该利用之命名空间:

polls/urls.py

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

app_name = 'polls'
urlpatterns = [
    url(r'^$', views.index, name='index'),
    url(r'^(?P<question_id>[0-9]+)/$', views.detail, name='detail'),
    url(r'^(?P<question_id>[0-9]+)/results/$', views.results, name='results'),
    url(r'^(?P<question_id>[0-9]+)/vote/$', views.vote, name='vote'),
]

本,让我们将代码修改得重新谨慎一点,将脚的:
polls/templates/polls/index.html

<li><a href="{% url 'detail' question.id %}">{{ question.question_text }}</a></li>

修改为:

<li><a href="{% url 'polls:detail' question.id %}">{{ question.question_text }}</a></li>

专注引用方法是引号而无是圆点也未是斜杠!!!!!!!!!!!!

暨是,我们可以上下部分之学科了。

下一场,我虽balabalabala说了自己本着做APP的见识,一万分盏冰水的量,真麻烦。
自从举报来拘禁,大家对自之想法认可度还不易。

2.5.2 编写更多的视图

下面,让咱们打开polls/views.py文件,输入下列代码:

polls/views.py

def detail(request, question_id):
    return HttpResponse("You're looking at question %s." % question_id)

def results(request, question_id):
    response = "You're looking at the results of question %s."
    return HttpResponse(response % question_id)

def vote(request, question_id):
    return HttpResponse("You're voting on question %s." % question_id)

接下来,在polls/urls.py文件被入下面的url模式,将该映射到我们地方新增的视图。

polls/urls.py

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

urlpatterns = [
    # ex: /polls/
    url(r'^$', views.index, name='index'),
    # ex: /polls/5/
    url(r'^(?P<question_id>[0-9]+)/$', views.detail, name='detail'),
    # ex: /polls/5/results/
    url(r'^(?P<question_id>[0-9]+)/results/$', views.results, name='results'),
    # ex: /polls/5/vote/
    url(r'^(?P<question_id>[0-9]+)/vote/$', views.vote, name='vote'),
]

兹去浏览器被做客“/polls/34/”(注意:这里大概了域名。另外,使用了二级路由,url中都使补偿加polls部分,参考前的节),它以运行detail()方法,然后于页面被形你当url里供的ID。访问“/polls/34/results/”和“/polls/34/vote/”,将分头显示预定义的私自结果跟投票页面。

上面访问的路由过程如下:当有人看“/polls/34/”地址时,Django将首先加载mysite.urls模块,因为它们是settings文件里装的根URL配置文件。在该公文里,Django发现了urlpatterns变量,于是当其外仍顺序的拓匹配。当它们相当上了^polls/,就排去url中相当的文书polls/,然后将剩余的公文“34/”,传递让“polls.urls”进行下一致步之处理。在polls.urls,又相当到了r’^(?P<question_id>[0-9]+)/$’,最终结果虽是调动用该模式对应之detail()视图,也不怕是底下的函数:

detail(request=<HttpRequest object>, question_id='34')

函数中之question_id=’34’参数,是由(?P[0-9]+)而来。在正则表达式中经一个复圆括如泣如诉,Django会捕获其相当到的价并传递让相应之视图,作为视图的职位参数有,而?P则表示自己一旦受这捕获的价指定一个异的变量名,在视图中可由此question_id这个变量誉为自由的援它,形成一个着重字参数,不用考虑参数的岗位。至于[0-9]+则是一个充分简单的原生正则表达式,用于匹配同多级连续的数字,它相当到的价值吗尽管是切实而传送的参数值。

富有的URL模式还是正则表达式,Django不限制而以url模式中之开道。但是,你真的没必要书写一个之类的较为愚蠢的带有”.html”的模式,它明确是尚未必要,不够精炼的:

url(r'^polls/latest\.html$', views.index),

君一点一滴可据此脚的模式代表上面的:

url(r'^polls/latest$', views.index),

3)最要紧之,想清楚APP这种措施的利弊。

2.5 第一只Django app,Part 3:视图和模板

本章承上启下,主要介绍Django的视图概念。

  • 召开一个询问北京学区房的APP,输入小区名,输出是哪个学校的学区房。
  • 举行一个解密兴趣讨论的APP,讨论加密解密的体会技巧。
  • 做一个捡拾钱完璧归赵失主的APP,捡钱发布->失主认领。
  • 开一个北京市交天津汽车时刻表的APP,解决官网BWIN必赢亚洲56.net更新不立即的题材。
  1. H5网站:无需安装/更新,有链接即可访问,超轻量。
  2. 微信公号:提供基础交互逻辑、朋友围分享渠道、可push可编程。
  3. WordPress|discuz:基础意义任需付出,当天齐丝,提供整机内容管理后台。
  4. 小组贴吧知乎简书:目标用户扎堆,便于快速启动运营/测试/拉拢。

2)从精益创业之思量来拘禁,上来便做APP不足够好。

4)一些案例思考

接下来,,开心的讲话通常会卡壳交一个问题上:
** “你打算做一个独立APP,是怎考虑的啊?”**

  1. 支撑再次增长的互设计,更好之用户体验。(相比H5页面)
  2. 对配备产生重复充分之控制权。(如获得用户位置,使用摄像头、陀螺仪、NFC等)
  3. 出品与用户发生更好之交互。(主动push通知、后台任务等)

自己历来厌恶纯凭感觉拍首的章程,所以对我弗打听的行当,都见面于行业背景、现状痛点、竞争状况、产品测试相当一点点问起聊开。
(应该是为这些题材是投资人爱问的吧,大家还针对答而流,应该有了准备)

遂自己的建议是——
如果你的成品更依赖让特定交互、硬件装备及信息通知,那便决然做APP。
倘若不是,尤其是媒体类、兴趣小组类,那就是不错再想想。

乃总结一下状出来,省点以后的唾液星子,出门左转这里看,哈哈。

创业初期,我道最好重大之是便捷投入市场、验证idea、并探索产品模式。

末总结一词话:以后哪位而以遇见这个题材,我就是把当时篇稿子贴她脸蛋,哇嘎嘎。

新近痴迷上了初产品之大势分析和演绎。

理所当然其乐融融的拉扯突然凝固了,我起听到各种各样的报:

1)一些产品idea根本支撑不由一缓慢值得创业的独立APP。

  1. 嘀嘀打车
    定位及,打车软件是工具,轻社交,所以最初在应酬媒体齐价值不殊。
    假如打车还依赖让地图、GPS、push、支付等竞相场景
    用要做个APP。

  2. 功夫熊、宜深及小等020上派
    活最初,其实就是寻觅列表、下单的根基流程,无重交互。
    所以,现在大气随即好像制品都是微信公号+移动网站启动,并借势微信平台推广。
    产品走起,获得稳定大量订单后,再考虑独立做APP。

  3. 罗辑思维
    住户《罗辑思维》都出三百大抵万爱智求真的小伙伴了,依然就是视频+微信公号。
    实质上对这仿佛内容吗主导的产品(媒体)来说,做APP基本没有意义。
    自家猜除非有同等龙,罗胖下决心想死做超市、会员社交,否则应当无会见轻易碰APP。

是的方法论应该是辩证的对待世界上的整事物,这起事呢非异。

APP这种活形式,能提供什么样特殊价值?我总主要出三碰:

“我当创业啊,就得立就做一款APP出来。” 这是种植信仰,得治。

自家收获多数底答案,是NO。

  • 做一个APP,可以将到再次多投资啊。
  • 挪动互联网创业无就是是理所应当做APP的也?
  • 额,,额,,,不然呢?
  • 匪做APP叫什么创业啊?(同时对本身投来不屑的眼力~)

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图