【问题标题】:Django Model Form not showing errors after validation in clean()在 clean() 中验证后,Django 模型表单不显示错误
【发布时间】:2020-11-14 21:46:10
【问题描述】:

你能帮我解决这个问题吗?我有一个模型表单,我需要在模型表单的 clean 方法中验证两个日期时间对象后引发错误。这就是我所拥有的。 表格

class HorariosDisponibles(forms.ModelForm):
    tutor = forms.ModelChoiceField(queryset=Tutor.objects.all(),widget=forms.Select(attrs= {'class': 'input is-small is-rounded ' }),label='TUTOR',)
    dia_hor_inicio =forms.DateTimeField(widget=forms.DateTimeInput(attrs= {'class': 'input is-small is-rounded ',}),label='Horario de Inicio', initial=datetime.date.today )
    dia_hor_fin= forms.DateTimeField(widget=forms.DateTimeInput(attrs= {'class': 'input is-small is-rounded ' }),label='Horario de Finalización', initial=datetime.date.today)

    class Meta:
        model = horarios_disp
        fields = '__all__'


    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields["dia_hor_inicio"].widget = DateTimeInput()
        self.fields["dia_hor_inicio"].input_formats = ["%Y-%m-%dT%H:%M", "%Y-%m-%d %H:%M"]
        self.fields["dia_hor_fin"].widget = DateTimeInput()
        self.fields["dia_hor_fin"].input_formats = ["%Y-%m-%dT%H:%M", "%Y-%m-%d %H:%M"]
    
    def clean(self):

        cleaned_data = super(HorariosDisponibles, self).clean()
        tutor = cleaned_data.get("tutor")
        dia_hor_inicio = cleaned_data.get("dia_hor_inicio")
        dia_hor_fin = cleaned_data.get("dia_hor_fin")
        
        if dia_hor_inicio and dia_hor_fin:
            if dia_hor_inicio.day != dia_hor_fin.day :
                msg = 'Las fechas no pueden ser distintas'
                self.add_error("dia_hor_inicio", msg)
                
                raise forms.ValidationError("Las fechas no pueden ser distintas")
                #NEITHER OF THIS APPROACHES WORKED
        return cleaned_data

观看次数

@login_required
def horario_tutor(request):
    context = {

    }
    
    if request.method == 'POST':
       
        print(request.POST)
        form = HorariosDisponibles(request.POST)
        
        
        if form.is_valid():
            tutor = form.cleaned_data['tutor']
            print("adentro")
            dia_hor_inicio = form.cleaned_data['dia_hor_inicio']
            dia_hor_fin = form.cleaned_data['dia_hor_fin']
            tutor_horario = horarios_disp(
                tutor=tutor, dia_hor_inicio=dia_hor_inicio, dia_hor_fin=dia_hor_fin)
            tutor_horario.save()

            context = {
                'form': form
            }
            return redirect("home")
        return render(request,"horarios_disponibles.html", context)

    else:

        form = HorariosDisponibles()

        context['form'] = form
    return render(request, "horarios_disponibles.html", context)

模板

{% extends 'base.html' %}

{% block body %}
<section class="section">
    <div class="columns is-vcentered">
        <div class="column is-centered is-4 is-offset-2">

            <form method="post">
                {% csrf_token %} 
                {% for field in form %}
                <div class="field">
                    {% for error in field.errors %}
                                    <p class="help is-danger">{{ error }}</p>
                    {% endfor %}
                    <label for="{{field.id_for_label}}" class="label">{{ field.label }}</label>
                  {{ field }}  
                  
                      
                  {% for non_field_error in form.non_field_errors %}
                            <p class="help is-danger">{{ non_field_error }}</p>
                    {% endfor %}
                  {% if field.help_text %}
                  <p class="help is-danger">{{ field.help_text|safe }}</p>
                  {% endif %}
            </div>    
           
            {% endfor %}
            
            <p class="control">
                <button class="button is-link" type="submit">
                  Enviar
                </button>
              </p>
            </form>
</section>

它验证我是否在表单中输入了两个不同的日期,但它没有输入到 is_valid() (因为表单无效)。只渲染模板的按钮。

【问题讨论】:

  • 让我清楚一点:如果表单有两个不同的日期,您想引发错误吗?
  • 是的,这正是我想要的。它进行验证,但我正在努力向用户显示错误,因此它可以更新输入。

标签: python django django-forms


【解决方案1】:

试试这个:

if form.is_valid():
    tutor = form.cleaned_data['tutor']
    dia_hor_inicio = form.cleaned_data['dia_hor_inicio']
    dia_hor_fin = form.cleaned_data['dia_hor_fin']
    tutor_horario = horarios_disp(
        tutor=tutor, dia_hor_inicio=dia_hor_inicio, dia_hor_fin=dia_hor_fin
    )
    tutor_horario.save()
    context = {'form': form}
    return redirect("home")
else:
    context = {'error': 'whatever error you want to show here'}
    return render(request, "horarios_disponibles.html", context)
# and probably some extra handling at the end in case there are errors

事实上,您无需在代码开头声明 context = {} 之前的 if request.method == 'POST',因为无论如何您都将在 if-else 语句中声明一个 on。

【讨论】:

  • 成功了!!!我只需要再次传递上下文并渲染它。现在的问题是错误也在“导师”字段中打印。如何仅在 dia_hor_inicio, dia_hor_fin 中显示错误? imgur.com/nFqjXgo
  • 那么你应该传入一个额外的上下文,比如{'error_start': 'message1', 'error_end': 'message2'},然后分别检查它们
猜你喜欢
  • 2018-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-05
  • 1970-01-01
  • 1970-01-01
  • 2021-08-26
相关资源
最近更新 更多