接着上一部分,在这个部分主要是添加网页相关的一些内容.
对应的源码也放在了github仓库中mysite-part3

开始

概述

在我们的polls的应用中,我们需要以下的四个视图:

  • Question的index页面—显示最近的问题
  • Question的detail页面—显示一个问题的详细信息,可以投票
  • Question的results页面—显示一个问题的结果
  • 投票功能—能够处理投票信息
    阅读全文 »

开始

这是Writing your first Django app, part 2
接着第一部分的例子继续,在这个部分我们要设置数据库,创建第一个模型并且快速介绍一下django的自动生成的admin管理页面.
自己写的代码也同步在github的仓库里:mysite-part2

数据库设置

现在,打开mysite/settings.py文件,这是一个默认的python模型的设置.
Python默认使用的是SQLite数据库,如果不需要自己配置数据库的话,使用默认的即可.而且SQLite数据库已经在Python的模块里,不需要额外的安装.
这里对于其他数据库的配置不做解释,因为只是入门程序,之后在用到如Mysql的时候会再讲到.
现在只要输入如下的命令就可以生成对应的数据库(第一次使用):
$ python manage.py migrate
看到如下的信息的话,就说明生成完成了:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Operations to perform:  
Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
Applying admin.0001_initial... OK
Applying admin.0002_logentry_remove_auto_add... OK
Applying contenttypes.0002_remove_content_type_name... OK
Applying auth.0002_alter_permission_name_max_length... OK
Applying auth.0003_alter_user_email_max_length... OK
Applying auth.0004_alter_user_username_opts... OK
Applying auth.0005_alter_user_last_login_null... OK
Applying auth.0006_require_contenttypes_0002... OK
Applying auth.0007_alter_validators_add_error_messages... OK
Applying auth.0008_alter_user_username_max_length... OK
Applying sessions.0001_initial... OK

创建模型

在这个简单的app里,需要创建2个模型,Question和Choice.Question里包含了问题和提问的时间,Choice里包含了选择的文字和投票的信息.
polls/models.py文件里添加如下的信息:

1
2
3
4
5
6
7
8
9
10
11
12
from django.db import models


class Question(models.Model):
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published')


class Choice(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE)
choice_text = models.CharField(max_length=200)
votes = models.IntegerField(default=0)

对应每一个class都会在数据库中生成对应的表和字段.而在对字段添加属性和限制的时候,使用的是Field类.对于Field的详细信息不做过多的描述.

激活模型

首先需要在settings.py文件里将app导入项目中,在INSTALLED_APPS属性中添加polls.apps.PollsConfig路径即可,如下:

1
2
3
4
5
6
7
8
9
INSTALLED_APPS = [    
'polls.apps.PollsConfig',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]

接下来就可以在命令行中输入:
$ python manage.py makemigrations polls
当看到如下的信息的时候,就表示正确运行了.

1
2
3
4
5
6
for 'polls':

polls/migrations/0001_initial.py:
- Create model Choice
- Create model Question
- Add field question to choice

接下来就可以在代码中对这2个对象进行操作了,在官方的文档中还介绍了如何在shell中来对数据库进行操作,这里就不写出来了,需要的话在官网可以看到.

注意

在模型中添加__str__() 很重要,这样就不会在读取对象的时候只看到对象的class名了.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from django.db import models
from django.utils.encoding import python_2_unicode_compatible


class Question(models.Model):
# ...这里是之前已经写好的代码,只需要在后面添加一个str的方法即可
def __str__(self):
return self.question_text


class Choice(models.Model):
# ...这里是之前已经写好的代码,只需要在后面添加一个str的方法即可
def __str__(self):
return self.choice_text

至此,对于简单的数据库模型的操作就可以进行了,在代码中直接使用如:**Question.objects.all()来查询所有的对象,用save()**函数就可以向数据库中插入对象,Django推荐在查询的时候使用filter来进行限定条件的查询,比如:

1
2
Question.objects.filter(id=1)
Question.objects.filter(question_text__startswith='What')

注:__startswith这类的方法是更高级的查询限制的方法,详细的可以查看官方的文档,这里的意思很明显就是,查询question_text字段中以what开头的信息.

介绍Django Admin

这也算是我非常喜欢的一个Django的特性了,对后台管理的操作可以直接使用内置的模块来很简单的生成,简直是快速开发的福音.

创建

只需要下面的一行命令就可以:
$ python manage.py createsuperuser
接下来就会需要你填写Username,Email和password,输入正确之后就打开了Django的admin模块了.
接下来启动服务器,然后在浏览器中输入http://127.0.0.1:8000/admin/就可以访问admin后台了.
图片
进入之后就可以看到如下的页面:
tupian

添加管理模块

在polls/admin.py文件中添加一行代码,就可以把Question这个表添加在admin管理中,简直不要太爽了.

1
2
3
4
from django.contrib import admin
from .models import Question

admin.site.register(Question)

刷新页面之后,就可以在后台页面看到polls app中多了Questions的管理页面:
图片
然后就可以对Question进行操作了~

总结

Django确实非常的方便,在对于简单的页面的开发的时候,确实是很快.特别是类似于admin一样的现成的模块,拿来就可以直接使用.

题目及理解

题目链接:476. Number Complement

Given a positive integer, output its complement number. The complement strategy is to flip the bits of its binary representation.

Note:

  1. The given integer is guaranteed to fit within the range of a 32-bit signed integer.
  2. You could assume no leading zero bit in the integer’s binary representation.

Example 1:

1
2
3
Input: 5
Output: 2
Explanation: The binary representation of 5 is 101 (no leading zero bits), and its complement is 010. So you need to output 2.

Example 2:

1
2
3
Input: 1
Output: 0
Explanation: The binary representation of 1 is 1 (no leading zero bits), and its complement is 0. So you need to output 0.

理解

水题,就是按位取反

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Solution {
public:
int findComplement(int num) {
int flag = 0;
int ans=0,a=1;
while (num > 0){
flag = num % 2;
num /= 2;
ans += (flag==0?1:0) * a;
a*=2;
}
return ans;
}
};

其他解法

看了Discuss里面的解法,还是有很多骚操作的大神的.这里贴出一个来看看.
链接

1
2
3
4
5
6
7
8
class Solution {
public:
int findComplement(int num) {
unsigned mask = ~0;
while (num & mask) mask <<= 1;
return ~mask & ~num;
}
};

理解

先让mask全部取1,然后对num取&操作,使得在对应前导0的地方全部置1,剩下的位全部是0,然后再对2个数进行&操作,就是取反了.

0%