【发布时间】:2012-01-20 19:33:21
【问题描述】:
这可能是一个愚蠢的问题,但我有点不确定手动设置cleaned_data 是否安全。文档says:
一旦is_valid()返回True,就可以处理表单提交了 知道它符合定义的验证规则是安全的 以你的形式。虽然您可以在此处直接访问 request.POST 点,最好访问form.cleaned_data。这个数据没有 仅经过验证,但也将转换为相关的 适合您的 Python 类型。
对于更多上下文,假设我们有一个模型表单,其中包含多个字段,例如书名、书名和请求 url 的字段。
表单条件为:如果url字段为空,用户必须提供标题和作者。如果给出了 url 字段而没有其他内容,我会从给定的 url 解析 html 并自动为用户提取标题和作者。
在我自动从 url 中获取标题和作者的情况下,处理将这些数据保存到模型的最佳方法是什么,因为表单将为作者和标题返回一个空的 clean_data?我确保解析的数据符合我在模型中的验证规则,但是像这样设置 clean_data 似乎很可疑。
在modelform类中:
def save(self, commit = True, *args, **kwargs):
parsed_title = ... # String returned by my html parsing function
parsed_author = ... # String returned by my html parsing function
self.cleaned_data['title'] = parsed_title
self.cleaned_data['author'] = parsed_author
编辑:
谢谢,我做到了:
def save(self, commit=True, *args, **kwargs):
instance = super(BookInfoForm, self).save(commit=commit, *args, **kwargs)
....
instance.title = parsed_title
instance.author = parsed_author
return instance
这有点离题,因为您已经回答了原始问题,但上面的代码破坏了其他部分。不是将编译后的信息保存到http://..../media/books/<id>,其中<id> 是图书ID,而是将其保存到http://..../media/books/None。
我的views.py 中有一个添加/编辑功能,用于处理添加和编辑:
def insert_or_modify(request, id=None):
if id is not None:
book = BookModel.objects.get(pk=id)
else:
book = BookModel()
if request.method == 'POST':
form = BookInfoForm(request.POST, instance=book)
if form.is_valid():
form.save()
....
return render_to_response(...)
有没有办法确保 id 存在,这样我就不会得到 id=None?我想更具体地说,在模型表单的 save() 中,如果 instance.id = None 有没有办法创建一个带有 id 的新实例?虽然我认为调用 super(ModelForm, self).save(...) 会为我做到这一点?
再次感谢!
【问题讨论】:
标签: django django-forms