0

已解決:閱讀Daniel Roseman的簡潔答案。它工作完美。Django UpdateView使用自定義創建視圖的驗證

我不是Django的專家:抱歉,如果我的問題有一個微不足道的答案。
我正在使用Django dev(1.8?)。
我的應用程序管理某些需要驗證和連貫的DATE類型的條目。因此,在

views/create_fest.py 

我有如下:

class Formulario_nuevo_festivo(forms.ModelForm): 

class Meta: 
    model = Festivo 
    fields = ('nombre_festivo','fecha_unica','fecha_inicio','fecha_fin') 
def clean(self): 
    cleaned_data=super(Formulario_nuevo_festivo,self).clean() 
    fecha_unica  =cleaned_data.get("fecha_unica","") 
    fecha_inicio =cleaned_data.get("fecha_inicio","") 
    fecha_fin  =cleaned_data.get("fecha_fin","") 
    if fecha_unica and fecha_inicio and fecha_fin: 
     raise forms.ValidationError(u"some message") 
    elif not fecha_unica and not fecha_inicio and not fecha_fin: 
     raise forms.ValidationError(u"some message") 
    elif (fecha_unica and (fecha_inicio!=None or fecha_fin!=None)) or (fecha_inicio and not fecha_fin) or (fecha_fin and not fecha_inicio): 
     raise forms.ValidationError(u"some message.") 
    else: 
     if (fecha_unica and (fecha_inicio==None or fecha_fin==None)): 
      pass 
     elif fecha_inicio > fecha_fin or fecha_inicio==fecha_fin: 
      raise forms.ValidationError(u"some message.") 
     else: 
      pass 
    return cleaned_data 

def page(request): 
    if request.POST: 
     form = Formulario_nuevo_festivo(request.POST) 
     if form.is_valid(): 
      form.save() 
      return HttpResponseRedirect(reverse_lazy('listado_festivos')) 
     else: 
      return render(request, 'crear_festivo.html',{'form':form}) 
    else: 
     form=Formulario_nuevo_festivo() 
     return render(request,'crear_festivo.html',{'form':form}) 

這完美的作品:驗證工作正常,用戶只能夠通過與validation- 問題完成創建一個對象,當我自帶使用更新視圖來管理改變這種模式: 這裏來的一段代碼views.py段內:

... 
class FestivoUpdateView(UpdateView): 
model   = Festivo 
fields   = ['nombre_festivo','fecha_unica','fecha_inicio','fecha_fin'] 
template_name = "editar_festivo.html" 
success_url  = reverse_lazy('listado_festivos') 
def post(self, request, *args, **kwargs): 
    if "cancel" in request.POST: 
     self.object = self.get_object() 
     url = self.get_success_url() 
     return HttpResponseRedirect(url) 
    else: 
     return super(FestivoUpdateView, self).post(request, *args, **kwargs) 
... 

問題是用戶可以輸入任何數據到這個UdateView中,而不需要任何驗證。

我搜查了很多(因爲我不是英語母語的人),但我沒有找到答案的運氣。
一個懶惰的程序員會說:「嘿,你可以在views.py中重複驗證代碼並再次進行驗證」,但它會違反DRY哲學,我確信必須有一個簡單的方法來強制UpdateView使用創建視圖驗證。

那麼如果我把它放在像「core/validate.py」這樣的地方,然後將它作爲函數導入呢? 我不知道如何解決這個問題,任何幫助將不勝感激。
致謝提前

+0

請勿使用dev版本。堅持穩定的1.7版本。 – 2014-12-04 15:15:02

回答

0

您只需將您的視圖告訴use your form即可。

class FestivoUpdateView(UpdateView): 
    form_class = Formulario_nuevo_festivo 
    ...etc... 

注似乎沒有在你的任何形式,使得它僅用於的節日,所以你可能需要將其重命名爲更通用的(和PEP8兼容),如FormularioFestivo 。

+0

感謝您回答如此之快,而且如此簡潔。 Daaamn!解決方案似乎非常明顯......事實上,我之前在搜索文檔時遇到過......但是我的導入沒有解決。反正我明天再試一次。 你的意思是從Formulario_nuevo_festivo改爲FormularioFestivo? :) – peter 2014-12-04 15:32:02

+0

已解決!謝謝丹尼爾。 – peter 2014-12-05 09:10:01