带括号的Django CVB属性

时间:2017-08-19 02:55:12

标签: python django

我正在尝试使用Book Django释放来学习Django。在第9章中,作者将表单显示方法重写为基于类的视图(CBV)。我试图理解为什么在调用类属性时使用了一组括号。我假设它是因为class属性将存储一个表单对象,但我想进一步理解它。

from django.shortcuts import render, get_object_or_404, redirect
from .models import Tag, Startup
from .forms import TagForm
from django.views.generic import View

class PostCreate(View):
    form_class = PostForm
    template_name = 'blog/post_form.html'

    def get(self, request):
        return render(
            request,
            self.template_name,
            {'form': self.form_class()})

    def post(self, request):
        bound_form = self.form_class(request.POST)
        if bound_form.is_valid():
            new_post = bound_form.save()
            return redirect(new_post)
        else:
            return render(
                request,
                self.template_name,{'form': bound_form})

如您所见,在14行代码

    {'form': self.form_class()})

但是在最后一行,代码是

            self.template_name,

我很困惑为什么作者在第一个类属性而不是第二个属性上使用括号。你能解释一下吗

谢谢

1 个答案:

答案 0 :(得分:1)

  

我很困惑为什么作者在第一个类属性而不是第二个属性上使用括号。你能解释一下吗。

get中,作者使用了self.form_class(),即实际为PostForm(),因为self.form_class只是对PostForm类的引用,所以当self.form_class括号时即self.form_class()它是PostForm的实例,没有传递任何参数。

post方法作者中的

正在将request.POST传递给self.form_class,这只是PostForm的引用,所以现在它是PostForm(request.POST)并将其分配给bound_form变量bound_form,因此self.view.endEditing(true) 按原样传递。

希望这可以解决你的困惑