已解决:阅读 Daniel Roseman 的简洁答案。它工作得很好。
我不是 Django 方面的专家:抱歉,如果我的问题有一个微不足道的答案。
我正在使用 Django 开发(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})
完美的工作:验证工作正常,用户只能通过完成验证来创建一个对象 - 当我使用 UPDATEVIEW 管理对此模型的更改时出现问题:这是片段内的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 使用 create查看验证。
如果我把它放在像“core/validate.py”这样的地方然后将它作为一个函数导入呢?我不知道如何解决这个问题,任何帮助将不胜感激。
提前谢谢