在Django手动设置cleaning_data有危险吗?

时间:2011-12-15 02:35:18

标签: django django-forms

这可能是一个愚蠢的问题,但我有点不确定手动设置cleaning_data是否安全。文档says

  

一旦is_valid()返回True,您就可以处理表单提交   安全地知道它符合定义的验证规则   通过你的表格。虽然您可以直接访问request.POST   点,最好访问form.cleaned_data。这个数据没有   仅经过验证,但也将转换为相关的   Python类型。

有关更多背景信息,请说我们有一个模型表单,其中包含多个字段,例如书籍标题,书籍作者以及要求提供网址的字段。

表单条件是:如果url字段为空,则用户必须提供标题和作者。如果给出url字段而没有其他内容,我将解析给定url中的html并自动为用户提取标题和作者。

如果我自动从网址中获取标题和作者,那么处理将此数据保存到模型的最佳方法是什么,因为表单会为作者和标题返回一个空的cleaning_data?我确保解析的数据符合我在模型中的验证规则,但设置cleaning_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?我想更具体地说,在modelform中的save()中,是否有一种方法可以创建一个具有id的新实例,如果instance.id = None?虽然我认为调用super(ModelForm,self).save(...)会为我做这个吗?

再次感谢!

1 个答案:

答案 0 :(得分:4)

如果您出现,您的意图不是设置cleaning_data,而是设置模型数据。因此,不要在save方法中设置cleaning_data,只需设置self.instance的属性,然后保存它。

关于手动设置cleaning_data,我认为这不一定是错的,在表格的干净方法中进行某些跨领域验证可能是有意义的,尽管这不是常见的情况。