Django-表单初始化如何工作?

时间:2019-05-24 13:45:25

标签: django django-forms django-views

在我看来,view代码看起来似乎应该在每次执行GET时都初始化表单类。

#views.py
if request.method == 'GET':
    form = PrenotaForm()
    return render(request, "prenota.html", {'form': form, 'posti_liberi': posti_disponibili, 'giovani_iscritti': giovani_iscritti})
else:
    # it's a POST

我要弄清楚的是为什么我的form类中的代码看起来不会在每次刷新时都执行:

# forms.py
class PrenotaForm(forms.ModelForm):
    size_gruppi = 30
    print("gruppi size is : " + str(size_gruppi))

在我的控制台中,我看到每次修改并保存 forms.py 文件时,或者每当我用python manage.py runserver启动服务器时,都执行该代码:

  

执行系统检查...

     

gruppi的大小是:30

但是感兴趣页面的简单刷新不会执行控制台中所示的代码:

  

Django 2.1版,使用设置“ test_project.settings”   在http://127.0.0.1:8000/处启动开发服务器退出服务器   使用CONTROL-C。 [24 / May / 2019 15:35:38]“获取/ it / iscrizione / prenota /   HTTP / 1.1“ 200 11898 [24 / May / 2019 15:35:38]”   /static/images/favicon.ico HTTP / 1.1“ 200 549 [24 / May / 2019 15:35:39]   “ GET / it / iscrizione / prenota / HTTP / 1.1” 200 11898 [24 / May / 2019   15:35:39]“ GET /static/images/favicon.ico HTTP / 1.1” 200 549   [24 / May / 2019 15:35:39]“ GET / it / iscrizione / prenota / HTTP / 1.1” 200   11898 [24 / May / 2019 15:35:39]“ GET /static/images/favicon.ico HTTP / 1.1”   200549

这引起了我的问题,因为表单并非总是更新(例如:动态选择DDL),从而触发验证错误。

我的方法/代码有问题,还是django MTV / MVC模式的正常行为?

我该怎么做才能在每次页面刷新时更新表单?

1 个答案:

答案 0 :(得分:1)

在python中,类属性(也称为“类成员”)在读取文件时与该类相关联。因此,size_gruppi是在首次导入文件时设置的。实例化一个类(PrenotaForm())时,将调用该类的__init__()方法。实例将具有与类相同的属性,除非您重写它。

因此,如果要在实例化类时更改某些属性,请添加初始化程序:

class PrenotaForm(ModelForm):
    size_gruppi = 30

    def __init__(self, *args, **kwargs):
        self.size_gruppi = kwargs.pop('size_gruppi', self.size_gruppi)
        super().__init__(*args, **kwargs)

# in your view
form = PrenotaForm(size_gruppi=50)  # form.size_gruppi = 50
form = PrenotaForm()  # form.size_gruppi = 30

因此,在这里我可以通过将属性传递给初始化程序来覆盖该属性。如果我不通过,则保留默认值。