Python ';自我';Django中的属性是否获取其实例?
我正在努力掌握Django和Python。我一直对函数中的Python ';自我';Django中的属性是否获取其实例?,python,django,instance,self,Python,Django,Instance,Self,我正在努力掌握Django和Python。我一直对函数中的self参数感到困惑 例如: class RegistrationForm(forms.ModelForm): email = forms.EmailField(label='Your Email') password1 = forms.CharField(label='Password', \ widget=forms.PasswordInput()) password2
self
参数感到困惑
例如:
class RegistrationForm(forms.ModelForm):
email = forms.EmailField(label='Your Email')
password1 = forms.CharField(label='Password', \
widget=forms.PasswordInput())
password2 = forms.CharField(label='Password Confirmation', \
widget=forms.PasswordInput())
class Meta:
model = User
fields = ['username', 'email']
def clean_password2(self):
print "Inside clean_password2:"
print self
print "_________________________________________________"
password1 = self.cleaned_data.get('password1')
password2 = self.cleaned_data.get('password2')
if password1 and password2 and password1 != password2:
raise forms.ValidationError("Passwords do not match")
return password2
终端中的输出为:
[02/Jul/2015 15:03:26]"GET /accounts/register/ HTTP/1.1" 200 5118
Inside clean_password2:
<tr><th><label for="id_username">Username:</label></th><td><input id="id_username" maxlength="30" name="username" type="text" value="TestUser" /><br /><span class="helptext">Required. 30 characters or fewer. Letters, digits and @/./+/-/_ only.</span></td></tr>
<tr><th><label for="id_email">Your Email:</label></th><td><input id="id_email" name="email" type="email" value="test@test.com" /></td></tr>
<tr><th><label for="id_password1">Password:</label></th><td><input id="id_password1" name="password1" type="password" /></td></tr>
<tr><th><label for="id_password2">Password Confirmation:</label></th><td><input id="id_password2" name="password2" type="password" /></td></tr>
[02/Jul/2015 15:03:26]“GET/accounts/register/HTTP/1.1”200 5118
内部清洁密码2:
用户名:
必需。30个字符或更少。仅限字母、数字和@/+/-/-。
您的电子邮件:
密码:
密码确认:
也就是说,self
属性就是上面显示的内容。问题是,这个函数和self属性是从哪里得到的
我不是在问self
作为python语言特性的作用。我的问题是关于self
如何在Django中获得一个实例
此代码所属的存储库
TL;DR:为什么我打印self的时候会打印所有的HTML。这是从哪里来的?如注释中所述,当您打印
self
时,您正在打印ModelForm
实例
在Python中打印对象时,它调用该对象的\uuuu str\uuuu
方法
如果查看Form类的方法,它将调用该方法,该方法将字段显示为html表的内容。这是您看到的输出
def __str__(self):
return self.as_table()
重复我听到一些人说“显式比隐式好”@TheGeorgeous:这个问题不是你所展示的重复。我不是在问作为python语言特性的self的角色。我的问题是赛尔夫如何在Django得到一个实例。在一个非常尖锐的例子中,我提到的例子。如果你仍然发现它是一个副本,请给出一个简短的答复。问题结束。@user248884,self没有“获取”实例。在Python中,当类引用自身时,这只是一种约定。因此,当您打印self时,您得到的是为特定类定义的实例属性。如果您的问题是如何将其转换为html,请检查django的ModelForm类“如何
self
获取实例”到底是什么意思?你在某个地方有一个实例,比如说my\u registration\u form
,所以当my\u registration\u form.clean\u password2()
被调用self
就是这个实例。如果你的问题是Django如何实例化和管理你定义的类,那就太宽泛了。只是,这个模型没有对应的def _ustr __;(self)。您也可以看到存储库。那么它从哪里来?self
是表单实例,而不是模型实例。我已经链接到表单的\uuuu str\uuuu
,并将代码包含在我上面的答案中。对。表单实例从何而来?问一下,Django的哪个部分将HTML作为表单实例发送。你的问题没有真正意义。在调用print self
的方法中,self
是一个表单实例。print语句正在调用str(self)
,它调用self.\uu str\uu()
,然后显示输出。我不知道你说的“哪一部分正在发送”是什么意思。