在我看来,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模式的正常行为?
我该怎么做才能在每次页面刷新时更新表单?
答案 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
因此,在这里我可以通过将属性传递给初始化程序来覆盖该属性。如果我不通过,则保留默认值。