1

解決済み: 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 に create検証を表示します。

「core/validate.py」のような場所に置いてから、関数としてインポートするとどうなりますか? これを解決する方法がわかりません。助けていただければ幸いです。
よろしくお願いします

4

1 に答える 1

2

フォームを使用するようにビューに指示するだけです。

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

あなたのフォームには、新しいフェスティバル専用のものは何もないように見えるので、名前をもっと一般的な (そして PEP8 に準拠した) もの、たとえば FormularioFestivo に変更することをお勧めします。

于 2014-12-04T15:18:20.917 に答える