Python中的超级函数

Ang*_*ngy 0 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 
Run Code Online (Sandbox Code Playgroud)

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})
Run Code Online (Sandbox Code Playgroud)

小智 5

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

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