2015-06-29 117 views
1

我試圖用Django的教程教程和覆蓋乾淨()方法不工作添加'http://'在我的網址。這段代碼有什麼問題?如何正確覆蓋乾淨()方法

forms.py

class PageForm(forms.ModelForm): 

    ... 

    def clean(self): 
     cleaned_data = self.cleaned_data 
     url = cleaned_data.get('url') 

     if url and not url.startswith('http://'): 
      url += 'http://' 
      cleaned_data['url'] = url 

     return cleaned_data 

views.py

def add_page(request, category_name_slug): 

    try: 
     cat = Category.objects.get(slug=category_name_slug) 
    except Category.DoesNotExist: 
     cat = None 

    if request.method == 'POST': 
     form = PageForm(request.POST) 
     if form.is_valid(): 
      if cat: 
       page = form.save(commit=False) 
       page.category = cat 
       page.views = 0 
       page.save() 
       return category(request, category_name_slug) 
     else: 
      print(form.errors) 
    else: 
     form = PageForm() 

    context_dict = {'category': cat, 'form': form} 

    return render(request, 'rango/add_page.html', context_dict) 

add_page.html

​​

管理工作正常,但HTML本身不接受這個寫作。

+0

@kaveman>你可以在'clean()'的開頭插入一個斷點並檢查self.cleaned_data'和'self.errors'的內容嗎?我敢打賭,網址不在前者,但錯誤信息已經在後者中。 – spectras

回答

1

你需要這個:

def clean(self): 
    cleaned_data = super(PageForm, self).clean() # <----------- 
    url = cleaned_data.get('url') 
    if url and not url.startswith('http://'): 
     url += 'http://' 
     cleaned_data['url'] = url 
    return cleaned_data 
+0

它仍然不起作用,當我嘗試添加像「www.google.com」這樣的網址時,它仍然會給我提示「請輸入網址」 – ArrowsX

+0

@ArrowsX如果您在模型級別使用網址字段,它會驗證並向您提供表單驗證錯誤以將「http://」添加爲有效的網址。至於重寫完整的clean方法只是爲了驗證一個字段不是非常像django而是使用clean_url(self) –

+0

@ doniyor ModelForm.clean()只是啓用唯一性驗證並返回self.cleaned_data。雖然它是正確的,但它應該被稱爲,它不會解決這個問題。 – spectras

1

通常情況下,因爲你正在清理只有一個字段,你應該在一個特定領域,方法clean_url做到這一點。

def clean_url(self): 
    url = self.cleaned_data['url'] 
    # your cleaning here 
    return url 
+0

我是否應該覆蓋乾淨的方法?我怎樣在views.py中調用它? – ArrowsX

+2

只需添加概述的clean_url()而不是原來的clean()。作爲一個規則:清理,只涉及一個領域應該進入特定領域的方法,清理涉及多個領域進入清潔()。當你調用is_valid()時,表單驗證被觸發。 – Mischback