2010-10-29 30 views
1

我們如何才能讓django表單無法驗證是否正在編輯,而不是添加新記錄。代碼如下:如何僅在添加未編輯時驗證django表單

class PageForm(forms.Form): 
    name = forms.CharField(max_length=100,widget=forms.TextInput(attrs={'class':'textInput'})) 
    description = forms.CharField(max_length=300, required=False,widget=forms.TextInput(attrs={'class':'textInput'})) 
    body = forms.CharField(widget=forms.Textarea) 
    template = forms.CharField(max_length=30,widget=forms.TextInput(attrs={'class':'textInput'})) 
    navbar = forms.BooleanField(required=False, widget=forms.Select(choices=(('True','True'), 
                      ('False', 'False')))) 
    publish = forms.BooleanField(widget=forms.Select(choices=(('Published','Publish Now'), 
                   ('Private','Private'), 
                   ('Draft','Draft')))) 

    def save(self, page=None, commit=True): 
     data = self.cleaned_data 
     if not page: 
      page = models.Page(key_name=data['name'].replace(' ','-')) 
     page.name = data['name'] 
     page.description = data['description'] 
     page.body = data['body'] 
     page.template = data['template'] 
     page.publish = data['publish'] 
     if commit: page.put() 
     return page 


    # prevent the same page 's name 
    def clean_name(self): 
     name = self.cleaned_data['name'] 
     query = models.Page.all(keys_only=True) 
     query.filter('name = ', name) 

     page = query.get() 

     if page: 
      raise forms.ValidationError('Page name "%s" was already used before' % name) 

     return name 

此名稱驗證的目的是防止具有相同名稱的記錄。但我發現,它也在編輯時生效,所以我們無法編輯記錄,因爲它會說'已存在相同名稱的記錄'。

實際上,對於編輯,保存功能頁param不會是沒有,但prev記錄,而不是保存一個新的。但是我們如何讀取這個參數,在clean_name函數中,我們現在可以判斷它是編輯還是創建?

非常感謝!

在clean_name功能
+0

你沒有使用ModelForm從頁面模型生成表單的原因?使用key_name作爲獨特的SlugField – sunn0 2010-10-29 12:30:05

回答

0

排除當前對象的查詢集

query.filter('name = ', name).exclude(pk=self.pk) 

或更改,如果條件檢查頁面和當前對象是不一樣的。

2

如果你正在編輯表單,那麼表單有一些實例,你可以檢查是否存在。

如果是這樣,那麼你可能正在編輯現有的對象..對嗎?

例如: 如果您正在編輯與表單對象,你多少創建表單對象是這樣的:

form = MyForm(instance = myobject) 

然後在你的表格類的方法,你可以檢查的形式已經在某種程度上保存的實例,它是在這裏描述: Test if Django ModelForm has instance

+0

爲什麼不是這個答案? – Atma 2013-09-15 20:06:45

0

對不起,我不能評論下你的傢伙後,不知道爲什麼。

@ sunn0:我沒有使用django模型,因此在appengine中部署應用程序,所以請使用appengine模型。

@Zayatzz:你可以展示一些代碼如何做到這一點?由於無論我們是添加還是編輯,我們總是在驗證之前將表單限定爲request.POST,所以不知道如何區分。

@Ashok:我根據你的建議做了一個解決方法。由於以前我沒有通過pk來形成,而是將prev對象作爲param傳遞,所以不能通過使用pk來排除。所以,我改變了代碼,並把額外的鍵作爲pk(如果創建,讓鍵爲空,但是如果用pk編輯填充鍵)並且只檢查條件,如果鍵字段不爲空,則意味着我們正在編輯。不知道這是否是最佳做法,但無論如何它都有效。