def METHOD_NAME(self):
    # First, make sure all existing fields are actually filled out
    for (k, v) in list(self.cleaned_data.items()):
        if k.startswith('cand'):
            if v == "-1":
                self._errors[k] = ErrorList(["You need to select a score for this candidate!"])
        else:
            raise Exception("Invalid field name found: %s" % k)
    # Second, make sure the fields match the candidates
    fields = self.cleaned_data.copy()
    for candidate in self.candidates:
        k = "cand%i" % candidate.id
        if k in fields:
            del fields[k]
        else:
            raise Exception("Data for candidate %i is missing" % candidate.id)
    if len(fields) > 0:
        raise Exception("Data for candidate not standing for election found!")
    # Finally, verify that all options have been found, and none have been duplicated
    options = list(range(1, len(self.candidates) + 1))
    for k, v in list(self.cleaned_data.items()):
        if int(v) in options:
            # First use is ok. Take it out of the list, so next attempt generates error
            del options[options.index(int(v))]
        else:
            # Not in the list means it was already used! Bad user!
            if k not in self._errors:
                # Only add this error in case the other error hasn't already fired
                self._errors[k] = ErrorList(["This score has already been given to another candidate"])
    if len(options) != 0:
        raise forms.ValidationError("One or more scores was not properly assigned!")
    return self.cleaned_data