gpt4 book ai didi

python - Django 表单预览 - 如何使用 'cleaned_data'

转载 作者:太空宇宙 更新时间:2023-11-03 12:52:28 26 4
gpt4 key购买 nike

感谢 Insin 回答之前的 question与此相关。

他的回答很有效,但我对“cleaned_data”的提供感到困惑,或者更准确地说,如何使用它?

class RegistrationFormPreview(FormPreview):
preview_template = 'workshops/workshop_register_preview.html'
form_template = 'workshops/workshop_register_form.html'

def done(self, request, cleaned_data):
# Do something with the cleaned_data, then redirect
# to a "success" page.

registration = Registration(cleaned_data)
registration.user = request.user
registration.save()
# an attempt to work with cleaned_data throws the error: TypeError
# int() argument must be a string or a number, not 'dict'
# obviously the fk are python objects(?) and not fk_id
# but how to proceed here in an easy way?



# the following works fine, however, it seems to be double handling the POST data
# which had already been processed in the django.formtools.preview.post_post
# method, and passed through to this 'done' method, which is designed to
# be overidden.
'''
form = self.form(request.POST) # instansiate the form with POST data
registration = form.save(commit=False) # save before adding the user
registration.user = request.user # add the user
registration.save() # and save.
'''

return HttpResponseRedirect('/register/success')

为了快速引用,这里是 post_post 方法的内容:

def post_post(self, request):
"Validates the POST data. If valid, calls done(). Else, redisplays form."
f = self.form(request.POST, auto_id=AUTO_ID)
if f.is_valid():
if self.security_hash(request, f) != request.POST.get(self.unused_name('hash')):
return self.failed_hash(request) # Security hash failed.
return self.done(request, f.cleaned_data)
else:
return render_to_response(self.form_template,
{'form': f, 'stage_field': self.unused_name('stage'), 'state': self.state},
context_instance=RequestContext(request))

最佳答案

我以前从未尝试过您在这里使用 ModelForm 执行的操作,但您可以使用 ** 运算符将 cleaned_data 字典扩展为注册构造函数所需的关键字参数:

   registration = Registration (**cleaned_data)

模型类的构造函数采用关键字参数,Django 的模型元类将这些关键字参数转换为结果对象的实例级属性。 ** 运算符是一种调用约定,它告诉 Python 将您的字典扩展为那些关键字参数。

换句话说...

你目前正在做的是这样的:

registration = Registration ({'key':'value', ...})

这不是您想要的,因为构造函数需要关键字参数,而不是包含关键字参数的字典。

你想做的是这个

registration = Registration (key='value', ...)

类似于此:

registration = Registration (**{'key':'value', ...})

同样,我从未尝试过,但它似乎可以工作,只要您不对表单做任何花哨的事情,例如向其添加 Registration 构造函数不期望的新属性。在这种情况下,您可能必须在执行此操作之前修改 cleaned_data 字典中的项目。

不过,通过表单预览实用程序,您似乎确实失去了 ModelForms 的某些固有功能。或许您应该将您的用例带到 Django 邮件列表,看看是否有对该 API 的潜在增强,可以使其更好地与 ModelForms 一起工作。

编辑

除了我上面描述的内容之外,您始终可以“手动”从 cleaned_data 字典中提取字段并将它们也传递到您的注册构造函数中,但需要注意的是您必须记住将此代码更新为您向模型添加新字段。

registration = Registration (
x=cleaned_data['x'],
y=cleaned_data['y'],
z=cleaned_data['z'],
...
)

关于python - Django 表单预览 - 如何使用 'cleaned_data',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/628132/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com