Django 如何在验证前覆盖字段值?
我有一个表单,在验证之前需要为它设置一些值。我正在努力:Django 如何在验证前覆盖字段值?,django,django-forms,Django,Django Forms,我有一个表单,在验证之前需要为它设置一些值。我正在努力: if request.method == 'POST': reservation_form = ReservationForm(request.POST, initial={'is_reservation':True, 'user':request.user}) 但它不起作用。如果我从(模型)表单中排除“user”字段,我会得到一个空约束错误,如果我包含它,我会得到一个验证错误。因此,要么它忽略初始值,因为我已排除该字段,要么r
if request.method == 'POST':
reservation_form = ReservationForm(request.POST, initial={'is_reservation':True, 'user':request.user})
但它不起作用。如果我从(模型)表单中排除“user”字段,我会得到一个空约束错误,如果我包含它,我会得到一个验证错误。因此,要么它忽略初始值,因为我已排除该字段,要么request.POST数据胜过它,即使该值未发布
那我该怎么做呢
好的,我希望我现在已经正确地理解了这个问题: 您有一个
ReservationForm
,它没有用户
,也没有是\u reservation
字段。因此,设置initial={'user':…}
没有任何意义,因为user
不是该表单的一部分(而且也不是保留的一部分)
另一方面,您有一个保留
模型,该模型由表单的一些值和一个附加的用户id填充,还有一个is_保留
布尔值
所以,通常你会这样写:
form = ReservationForm() # you migth want to set inital values here
if request.method == 'POST':
form = ReservationForm(request.POST)
if form.is_valid():
data = form.cleaned_data
reservation = Reservation() # create a new model
# copy the values from the form to your new model
reservation.payment_method = data['payment_methods']
reservation.payment_time = data['payment_time']
# set some additional values for the model (which are required)
reservation.user_id = request.session['user_id'] # for example
reservation.is_reservation = True
# save the reservation (all required fields, including the user_id are now set)
reservation.save()
请注意,这只是一个例子。我还没有看过你的模型课,所以你的模型看起来可能有点不同。但我认为你能适应它
更新
我认为以下方法可能有效(但您必须排除用户
和是您已经提到的预订
)
好的,我希望我现在已经正确地理解了这个问题:
您有一个ReservationForm
,它没有用户
,也没有是\u reservation
字段。因此,设置initial={'user':…}
没有任何意义,因为user
不是该表单的一部分(而且也不是保留的一部分)
另一方面,您有一个保留
模型,该模型由表单的一些值和一个附加的用户id填充,还有一个is_保留
布尔值
所以,通常你会这样写:
form = ReservationForm() # you migth want to set inital values here
if request.method == 'POST':
form = ReservationForm(request.POST)
if form.is_valid():
data = form.cleaned_data
reservation = Reservation() # create a new model
# copy the values from the form to your new model
reservation.payment_method = data['payment_methods']
reservation.payment_time = data['payment_time']
# set some additional values for the model (which are required)
reservation.user_id = request.session['user_id'] # for example
reservation.is_reservation = True
# save the reservation (all required fields, including the user_id are now set)
reservation.save()
请注意,这只是一个例子。我还没有看过你的模型课,所以你的模型看起来可能有点不同。但我认为你能适应它
更新
我认为以下方法可能有效(但您必须排除用户
和是您已经提到的预订
)
您还可以添加ReservationForm
类的定义吗?@tux:不确定这有什么帮助,但可以。您还可以添加ReservationForm
类的定义吗?@tux:不确定这有什么帮助,但可以。不。。。对不起,你弄错了。ReservationForm确实从模型继承了is_reservation
和user
字段,我只是不想渲染它们is\u reservation
应始终为True(在共享同一型号的另一种形式中为false),并且user
始终为request.user
。设置initial=
是有意义的,它就是不起作用。你给了我一个主意。。。我只是排除这两个字段,然后是有效的()
就不会被它们绊倒,然后我可以在表单中正确设置它们。是有效的
block.PS:一种更简单的方法是保留=保留表单(commit=False)
。那么你就不需要复制任何值了……嗯,我想你是对的,表单中没有这些字段。。。但只有当我将它们放入排除列表时。。我不在乎它们是否在那个列表中,我只是想让这该死的事情起作用:p排除它们,然后将它们设置在中是有效的应该会起作用。啊,好的。我还没有看过元
。。。添加一个exclude
将有效。但是您需要在其他地方提供值(initial无法工作,因为如果不渲染字段,则在渲染期间字段不能具有初始值)。另外,我通常使用WTForms和SQLAlchemy,并编写myform.populate\u model(mymodel)
there:DYes。。。这正是我遇到的问题。我来看看WT表格。。。反正我有点讨厌Django表格不。。。对不起,你弄错了。ReservationForm确实从模型继承了is_reservation
和user
字段,我只是不想渲染它们is\u reservation
应始终为True(在共享同一型号的另一种形式中为false),并且user
始终为request.user
。设置initial=
是有意义的,它就是不起作用。你给了我一个主意。。。我只是排除这两个字段,然后是有效的()
就不会被它们绊倒,然后我可以在表单中正确设置它们。是有效的
block.PS:一种更简单的方法是保留=保留表单(commit=False)
。那么你就不需要复制任何值了……嗯,我想你是对的,表单中没有这些字段。。。但只有当我将它们放入排除列表时。。我不在乎它们是否在那个列表中,我只是想让这该死的事情起作用:p排除它们,然后将它们设置在中是有效的应该会起作用。啊,好的。我还没有看过元
。。。添加一个exclude
将有效。但是您需要在其他地方提供值(initial无法工作,因为如果不渲染字段,则在渲染期间字段不能具有初始值)。另外,我通常使用WTForms和SQLAlchemy,并编写myform.populate\u model(mymodel)
there:DYes。。。这正是我遇到的问题。我来看看WT表格。。。反正我有点讨厌Django表格。
form = ReservationForm(request.POST)
reservation = form.save(commit=False)
reservation.user = request.user
reservation.is_reservation = True
reservation.save()