【问题标题】:Any danger in manually setting cleaned_data in Django?在Django中手动设置cleaned_data有什么危险吗?
【发布时间】: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


    【解决方案1】:

    在您介绍的情况下,您的意图不是设置cleaned_data,而是设置模型数据。因此,不用在save方法中设置cleaned_data,只需设置self.instance的属性,然后保存即可。

    关于手动设置cleaned_data,我觉得不一定是错的,在表单的clean方法中做一些跨字段验证可能比较有意义,虽然不是很常见的情况。

    【讨论】:

    • 谢谢,使用实例可能会更好,但现在我对如何处理 instance.id 是否存在有点困惑(请参阅编辑后的帖子)
    猜你喜欢
    • 2015-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-04
    • 1970-01-01
    • 2011-06-28
    • 1970-01-01
    • 2012-08-30
    相关资源
    最近更新 更多