Python中的超级函数

时间:2018-01-02 13:25:15

标签: python django

Wrt到下面的代码段,为什么模型中使用了super().__init__?它是如何工作的?

model.py

class DuckForm(forms.ModelForm):
    class Meta:
        model = Duck
        fields = ('description', 'name')

    def __init__(self, community, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.community = community

    def save(self, commit=True):
        duck = super().save(commit=False)
        if not duck.community_id:
            duck.community = self.community

        if commit:
            duck.save()
        return duck 

views.py

def add_duck(request):
    if request.method == 'POST':
        form = DuckForm(request.animal.community, data=request.POST)
        if form.is_valid():
            duck = form.save()
            return redirect('DuckData')
    else:
        form = DuckForm(request.user.community)
    return TemplateResponse(request, 'MyDuck.html', {'form': form})

1 个答案:

答案 0 :(得分:5)

调用super.method调用父类的method方法,在本例中为ModelForm。在这种情况下这是必要的,因为Django模型和表单在__init__方法中发生了各种奇怪的事情,如果你不调用super().__init__()那些就不会发生这种情况和对象将不会按预期行事。

另外作为旁注,这是python 2中的无效语法(但在python 3中完全有效且正确)。你必须写super(DuckForm, self).__init__来实现同样的目标。