這可能是一個愚蠢的問題,但我有點不確定是否可以安全地手動設置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(...)會爲我做這件事嗎?再次
謝謝!
謝謝,使用實例可能會更好,但是現在我對如何處理instance.id是否存在感到困惑(請參閱編輯的文章) – sharkfin 2011-12-15 21:44:51