Django UpdateView使用自定义创建视图的验证

时间:2014-12-04 13:26:28

标签: django django-views django-generic-views django-validation

解决:阅读Daniel Roseman的简洁回答。它运作得很好。

我不是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})

完美无缺:验证工作正常,用户只能通过验证来创建对象 - 当我使用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使用创建视图验证。

如果我把它放在像#34; core / validate.py"然后将其作为函数导入? 我不知道如何解决这个问题,任何帮助都会受到赞赏  提前谢谢

1 个答案:

答案 0 :(得分:0)

您只需将自己的观点告诉use your form

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

请注意,您的表单中似乎没有任何内容仅适用于节日,因此您可能希望将其重命名为更通用的内容(并符合PEP8标准),比如FormularioFestivo。