我正在阅读有关扩展用户模型的教程,但它似乎有效,但我有两个关于如何调用属性和构造函数的问题。首先,这是有问题的代码
主要模型是这个
class UserProfile(models.Model):
user = models.OneToOneField(User)
likes_cheese = models.BooleanField(default=True)
puppy_name = models.CharField(max_length=20)
User.profile = property(lambda u : UserProfile.objects.get_or_create(user=u)[0])--->Statement A
现在呈现给用户的表单是
class UserProfileForm(forms.ModelForm):
class Meta:
model = UserProfile
fields = ('likes_cheese','puppy_name')
并且呈现此表单的视图如下所示这是我的问题所在(在这里我只是对呈现表单感兴趣所以我删除了其他代码):
def user_profile(request):
display_page = "profile.html"
csrf_token = csrf(request)
args={}
user = request.user
profile = user.profile ---------------------->statement B - Question 1 below
form = UserProfileForm(instance=profile) ------->statement C - Question 2 below
args.update(csrf_token)
args["form"] = form
return render_to_response(display_page,args)
现在这是我的两个问题
Q1-为什么不将参数传递给profile
对象的属性User
?
根据我从陈述A中理解的是
User.profile = property(lambda u : UserProfile.objects.get_or_create(user=u)[0])
是该配置文件被定义为User的一个属性,它有一个setter函数,它是一个带参数的lambda。传递的参数在哪里?我所看到的就是这个(属性的参数没有被传递到我能看到的任何地方)
profile = user.profile
form = UserProfileForm(instance=profile)
Q2 - 在代码form = UserProfileForm(instance=profile)
中,我们将一个实例作为参数传递,但我的UserProfileForm没有构造函数?这里发生了什么。
提前致谢
答案 0 :(得分:2)
Q1 :因为您使用的是django预定义User
类,所以您有两个选项可以添加新属性(继承User
模型并说django使用它来添加新房产),或者就像你那样做。
当您致电user.profile
时,您已将user
作为参数传递,以便lambda
执行UserProfile.objects.get_or_create(user=user)[0]
Q2 :您的UserProfileForm
继承自已拥有构造函数的forms.ModelForm
。并且您可以传递instance
参数,以便使用模型数据(UserProfile
)填充该表单。
django.forms.ModelForm
同时从django.forms.models.BaseModelForm
继承并在__init__
中检查是否提供了instance
关键字参数,并从source填写如下表单
if instance is None:
# if we didn't get an instance, instantiate a new one
self.instance = opts.model()
object_data = {}