Tengo un formulario con dos campos. El usuario debe estar obligado a seleccionar sólo uno de los dos. No ambos y no ninguno. Intenté resolver esto sobrescribiendo el método de limpieza como se describe en Django Doc:
formularios.py
class ConfigureWorkout(forms.Form): first_exercise = forms.ModelChoiceField(empty_label="select", label="Choose First Exercise", queryset=FirstExercise.objects.all(), required=False) sec_exercise = forms.ModelChoiceField(empty_label="select", label="Choose Sec Exercise", queryset=SecExercise.objects.all(), required=False) def clean(self): first_exercise = self.cleaned_data.get("first_exercise") sec_exercise = self.cleaned_data.get("sec_exercise") if first_exercise and sec_exercise: raise forms.ValidationError("Enter either a First Exercise or a Secondary Exercise.") else: return self.cleaned_datavistas.py
def configure(request): configure_workout = ConfigureWorkout() if request.method == "GET": return render(request, "userprofile/some.html", configure_workout) else: return render(request, "app/other.html")modelo
<form action="{% url 'configure' %}" method="POST"> {% csrf_token %} {{ configure_workout }} <input type="submit" name="configuration_completed"> </form>Sin embargo, si pruebo esto seleccionando ambos campos en el formulario, no se mostrará ni generará un error. Paso el formulario con éxito y me envían a "other.html".
¿Qué me estoy perdiendo? Muchas gracias de antemano por cualquier ayuda :)
Parece que no está pasando datos reales a su formulario. Tal vez esto ayude:
def configure(request): configure_workout = ConfigureWorkout() if request.method == "GET": return render(request, "userprofile/some.html", configure_workout) else: configure_workout = ConfigureWorkout(request.POST) configure_workout.is_valid() configure_workout.clean() return render(request, "app/other.html")Sobre la base de la respuesta de @trafalinos y mirando la documentación en Formularios , sugeriría hacer lo siguiente:
En forms.py :
class ConfigureWorkout(forms.Form): first_exercise = forms.ModelChoiceField(empty_label="select", label="Choose First Exercise", queryset=FirstExercise.objects.all(), required=False) sec_exercise = forms.ModelChoiceField(empty_label="select", label="Choose Sec Exercise", queryset=SecExercise.objects.all(), required=False) def clean(self): cleaned_data = super().clean() # compare documentation first_exercise = cleaned_data.get("first_exercise") sec_exercise = cleaned_data.get("sec_exercise") if first_exercise and sec_exercise: raise forms.ValidationError("Enter either a First Exercise or a Secondary Exercise.") else: return self.cleaned_data Y (créditos a trafalino) en views.py :
def configure(request): if request.method == "GET": configure_workout = ConfigureWorkout() return render(request, "userprofile/some.html", configure_workout) else: configure_workout = ConfigureWorkout(request.POST) configure_workout.clean() return render(request, "app/other.html")