已解決:閱讀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」這樣的地方,然後將它作爲函數導入呢? 我不知道如何解決這個問題,任何幫助將不勝感激。
致謝提前
請勿使用dev版本。堅持穩定的1.7版本。 – 2014-12-04 15:15:02