bkaiser
bkaiser

Reputation: 657

Django Forms: Make Two Fields XOR Required?

I have two CharFields and I need to make it so that the user is required to fill EITHER one of them but not both (exclusive or). Is there an easy way to do this? Code:

def __init__(self, *args, **kwargs):
    super(AddMemberByUsernameForm, self).__init__(*args, **kwargs) 
    self.helper = FormHelper()

    self.helper.layout = Layout(
        'username',
        'student_id',
        'title',
        'tags',
        FormActions(
            Submit('save', _('Save changes'))
        )
    )

username = forms.CharField()    #field1
student_id = forms.CharField()  #field2 - these are the two fields
title = forms.CharField()
tags = forms.MultipleChoiceField(
    required=False,
    widget=forms.CheckboxSelectMultiple, 
    choices=[(x.id, x.name) for x in membership_ops.get_all_membership_tags()]
)

Upvotes: 2

Views: 759

Answers (1)

jproffitt
jproffitt

Reputation: 6355

You should override the form's clean method. Here is an example

def clean(self):
    cleaned_data = super(MyForm, self).clean()

    username = cleaned_data.get("username")
    student_id = cleaned_data.get("student_id")

    if username and student_id: # both were entered
        raise forms.ValidationError("Enter only one of username or student id")
    elif not username and not student_id: # neither were entered
        raise forms.ValidationError("You must enter a username or a student id")

    return cleaned_data

Upvotes: 6

Related Questions