2011-12-15 38 views
2

這可能是一個愚蠢的問題,但我有點不確定是否可以安全地手動設置cleared_data。該文檔says在Django中手動設置cleared_data有什麼危險?

一旦is_valid()返回true,您可以處理表單提交 的,因爲它符合你的表單定義 驗證規則的安全知識。雖然您可以直接在此 點訪問request.POST,但最好訪問form.cleaned_data。此數據並非 只有經過驗證,但也會被轉換爲相關的 Python類型。

對於更多的上下文,假設我們有一個模型表單,其中有幾個字段,例如書名,書的作者和要求url的字段。

表單條件是:如果url字段爲空,用戶必須提供標題和作者。如果給出url字段而沒有其他內容,我會解析給定url中的html並自動爲用戶提取標題和作者。

在我自動從url中獲取標題和作者的情況下,處理將此數據保存到模型的最佳方法是什麼?因爲表單會爲作者和標題返回空的cleared_data?我確保解析的數據符合我在模型中的驗證規則,但是像這樣設置cleared_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 

這是一個有點f因爲你已經回答了原始問題,但上面的代碼打破了其他部分。而不是將編譯的信息保存到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 =無?我想更具體地講,在保存()中的ModelForm,有沒有方法來創建新實例的ID,如果instance.id =無?雖然我認爲調用super(ModelForm,self).save(...)會爲我做這件事嗎?再次

謝謝!

回答

4

在你目前的情況下,你的本意是不設置cleaned_data,但該模型數據。因此,而不是設置在保存方法cleaned_data,剛剛成立的self.instance的屬性,然後保存。

關於手動設置cleaned_data,我不認爲這是一定是錯誤的,它可能是有意義的做,在一些交叉領域驗證形式的清潔方法,雖然它不是一個常見的情況。

+0

謝謝,使用實例可能會更好,但是現在我對如何處理instance.id是否存在感到困惑(請參閱編輯的文章) – sharkfin 2011-12-15 21:44:51

相關問題