无法理解如何调用模型上的此属性

时间:2016-09-24 21:25:19

标签: python django django-models lambda django-forms

我正在阅读有关扩展用户模型的教程,但它似乎有效,但我有两个关于如何调用属性和构造函数的问题。首先,这是有问题的代码

主要模型是这个

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没有构造函数?这里发生了什么。

提前致谢

1 个答案:

答案 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 = {}