为了账号安全,请及时绑定邮箱和手机立即绑定

请问一下 Django 中的 %s 是什么意思?

/ 猿问

请问一下 Django 中的 %s 是什么意思?

一只名叫tom的猫 2019-09-20 19:14:32

请问 Django 中的 %s 是什么意思?


查看完整描述

6 回答

?
RISEBY

%s是代表字符串, 如果你学过C语言就会知道这个。

在字符串里面加个 %s, 然后在字符串后面加上 %(变量名)就可以用后面的变量名所指向的字符串代替原有字符串中的 %s

当然,可以用 %d 代替整数型等等

比如

12= 100print "The value of a is %d" %a

还可以这么做

12= 100print "The value of a is {}".format(a)

这样可以用一对花括号来表示空位,然后在后面的 format 函数里依次填入你要输出的变量名,可以有多个空,但是花括号的对数和后面 format 函数的返回值的个数一定要相同

比如

123= 100= 200print "The value of a is {}, the value of b is {}".format(a, b)



查看完整回答
反对 回复 2019-09-22
?
万千封印
如果写成 print "The value of a is %d, the value of b is %d" %a,%b 就对了。
不过建议你用上面的format函数,这样就不用管类型了。
%d代表整数,%s代表字符串,其他的是我帮你找出来的,括号里是C语言里面用的,其他Python和C语言用法一样。

%d:输入输出为整形
%s:输入输出为字符串
%c字符%f:输入输出为浮点型

(%lf双精度浮点型)
(%ld 长整型 %hd短整型 %hu无符号整形 %u %lu)



查看完整回答
反对 回复 2019-09-22
?
胡说叔叔

整数是指数学上的整数,无范围限制。django中的整型是指Python的短整型,长整型等数据类型,都有范围限制。python中短整型的取值范围[-2417483648,2417483647],如果超过这个范围怎么办呢?就可以使用长整型数,不过在结尾必须写上大写的“L”,小写也可。但是为了避免与1混淆,建议用L

查看完整回答
反对 回复 2019-09-22
?
幕布斯5086720

class User(models.Model):
username = models.CharField(_('username'), maxlength=30, unique=True, validator_list=[validators.isAlphaNumeric]))
first_name = models.CharField(_('first name'), maxlength=30, blank=True)
last_name = models.CharField(_('last name'), maxlength=30, blank=True)
email = models.EmailField(_('e-mail address'), blank=True)
password = models.CharField(_('password'), maxlength=128))
class Meta:
ordering = ('username',)
每个属性就是一个库表的字段,定义起来非常简单明了,models里面提供了很多种类的Field类似上面的EmailField。不同的Field有不同的设置,可以看相应的原来来了解相关的设置.

在model class内部还有一个class Meta,这个Class的属性制定了这个表的一些存取策略,例如这里的ordering。MetaClass里面的属性可以用model的_meta属性取得。OK,那么这样一个model怎么就能实现对数据库表的灵活操作了呢。让我们来看看吧。

首先先分析一下/django/django/db/models/base.py这个文件,其中包含了models.Model这类的定义:

看看class定义的第一行吧,第一行就够我琢磨一阵子的了:

class Model(object):
__metaclass__ = ModelBase
Model采用了new style class定义,关于这个内容大家可以放狗看一下,第一行是一个__metaclass__属性的定义,该属性的值是ModelBase,这是一个类。__metaclass__的意思是,指定一个class,这个class的实例就是本class,相信您已经晕了。那么就拿这个Model的例子来说明一下,如果没有__metaclass__这个属性,产生一个实例就是正常的流程,有了这个属性流程会有改变:

首先调用BaseModel.__new__(cls, name, bases, attrs)这个方法,回返回的值是一个class类型,然后用这个class来创建实例。其实BaseModel就是Model的元类,来制定Model这个类的最终样子。关于元类的更多信息请看这里

那么我们的目光一下转移到BaseModel这个类上,我有种直觉,Meta这个class最后可以用_meta来取就是在这里做的手脚,看一下BaseModel的定义吧,有点长:

class ModelBase(type):
"Metaclass for all models"
def __new__(cls, name, bases, attrs):
# If this isn't a subclass of Model, don't do anything special.
if name == 'Model' or not filter(lambda b: issubclass(b, Model), bases): #1
return super(ModelBase, cls).__new__(cls, name, bases, attrs)

# Create the class.
new_class = type.__new__(cls, name, bases, {'__module__': attrs.pop('__module__')}) #2
new_class.add_to_class('_meta', Options(attrs.pop('Meta', None))) #3
new_class.add_to_class('DoesNotExist', types.ClassType('DoesNotExist', (ObjectDoesNotExist,), {}))

# Build complete list of parents #4
for base in bases:
# TODO: Checking for the presence of '_meta' is hackish.
if '_meta' in dir(base):
new_class._meta.parents.append(base)
new_class._meta.parents.extend(base._meta.parents)

model_module = sys.modules[new_class.__module__]

if getattr(new_class._meta, 'app_label', None) is None:
# Figure out the app_label by looking one level up.
# For 'django.contrib.sites.models', this would be 'sites'.
new_class._meta.app_label = model_module.__name__.split('.')[-2] #5

# Bail out early if we have already created this class.
m = get_model(new_class._meta.app_label, name, False) #6
if m is not None:
return m

# Add all attributes to the class.
for obj_name, obj in attrs.items():
new_class.add_to_class(obj_name, obj) #7

# Add Fields inherited from parents
for parent in new_class._meta.parents:
for field in parent._meta.fields:
# Only add parent fields if they aren't defined for this class.
try:
new_class._meta.get_field(field.name)
except FieldDoesNotExist:
field.contribute_to_class(new_class, field.name) #8

new_class._prepare()

register_models(new_class._meta.app_label, new_class) #9
# Because of the way imports happen (recursively), we may or may not be
# the first class for this model to register with the framework. There
# should only be one class for each model, so we must always return the
# registered version.
return get_model(new_class._meta.app_label, name, False) #10
简单分析一下这个代码:

1. 检查class是否为Model的子类,不是的话,不做任何处理,直接传给父类处理,也就相当于正常的处理了class,注意super在多重继承的时候应该严格使用

2. 用type来创建类,创建的就是正常的ModelClass

3. 这句很重要,add_to_class是Model里面的class方法,这个方法其实就是传入name和value,给Model添加class属性.看到了,原来神奇的_meta就是这么来的. 提到add_to_class方法,简单看一下它的代码:

def add_to_class(cls, name, value):
if name == 'Admin':
assert type(value) == types.ClassType, "%r attribute of %s model must be a class, not a %s object" % (name, cls.__name__, type(value))
value = AdminOptions(**dict([(k, v) for k, v in value.__dict__.items() if not k.startswith('_')]))
if hasattr(value, 'contribute_to_class'):
value.contribute_to_class(cls, name)
else:
setattr(cls, name, value)
add_to_class = classmethod(add_to_class)
最后一句是制定这个方法是class方法,特点就是方法的第一个参数是本class,其实classmethod就是一个装饰器,在2。4之后可以使用@来简写。这里不得不提的是他对Admin的特殊处理,虽然AdminOption不是在admin模块里面的,但是这么做还是跟一个Admin的东东绑定起来了,在java的世界解耦是一件大事,看到下面还有对'contribute_to_class'这个方法的特殊处理,django为啥不弄的解耦点呢。而且同样是包装成Option,一个是在BaseModel里面弄(那个Meta的包装),一个在add_to_class方法里面弄,实在有点不优雅,可能还没了解太多,不知道他的深度用意吧。
4. Meta的集成,Option的这个类提供继承方法

5. 取得applabel,就是把model的名字分割取到数第二个,我很喜欢-2这样的设定

6. get_model方法取得缓存里面的东西。

7. 把所有的class attr拿出来搞一遍,一般的属性就setattr弄回去了,要是这个属性有contribute_to_class这个callable属性,那就执行之(Admin的处理完全也可以这样,其实我们常用的objects就是用这个方法弄的)

8. 每个Field调用自己的contribute_to_class方法来进行特殊的处理

9. 进入缓存,,暂且叫缓存吧,里面的东西大家看看很简单 文件在 /django/django/db/models/loading.py 里面还是有很多内容的

10.看注释说的很清楚了,我们一定要在缓存里面拿model。




查看完整回答
反对 回复 2019-09-22
?
富国沪深

Django是一个开放源代码的Web应用框架,由Python写成。

1、Django是一个开放源代码的Web应用框架,由Python写成。采用了MVC的软件设计模式,即模型M,视图V和控制器C。

2、它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的,即是CMS(内容管理系统)软件。并于2005年7月在BSD许可证下发布。

3、这套框架是以比利时的吉普赛爵士吉他手Django Reinhardt来命名的。



查看完整回答
反对 回复 2019-09-22
?
qq_笑_17

null:
If True, Django will store empty values as NULL in the database. Default
is False.
如果为True,空值将会被存储为NULL,默认为False。

blank:
If True, the field is allowed to be blank. Default is False.
如果为True,字段允许为空,默认不允许。



查看完整回答
反对 回复 2019-09-22

添加回答

回复

举报

0/150
提交
取消
意见反馈 邀请有奖 帮助中心 APP下载
官方微信