def fill_form_with_dummy_data(self, form, post_data=None): import django.forms.fields import django.forms.widgets try: from captcha.widgets import ReCaptcha except ImportError: ReCaptcha = None if post_data is None: post_data = {} else: post_data = dict(post_data) fields_to_delete = [] for field in form: if field.field.required and not post_data.get(field.name): widget = field.field.widget if isinstance(widget, django.forms.widgets.Select): choices = list(widget.choices) if not choices: choices = list(field.field.choices) possible_values = [v for v, label in choices] if isinstance(widget, django.forms.widgets.SelectMultiple): value = [possible_values[0]] else: value = possible_values[0] elif isinstance(field.field, django.forms.fields.EmailField): value = "*****@*****.**" elif isinstance(widget, ReCaptcha): fields_to_delete.append(field.name) continue else: value = "Whee" post_data[field.name] = value query_dict = QueryDict('', mutable=True).copy() for key, value in post_data.iteritems(): if hasattr(value, '__iter__'): query_dict.setlist(key, value) else: query_dict.setlist(key, [value]) query_dict._mutable = False new_form = form.__class__(query_dict) for field_name in fields_to_delete: del new_form.fields[field_name] # post_data is not very useful if fields_to_delete is not empty, # because any form constructed with it won't validate, but it is # useful under some circumstances, so return it anyway. """ if fields_to_delete: post_data = None """ return new_form, post_data