django-multi-email-field

0.8.0 · active · verified Fri Apr 17

django-multi-email-field version 0.8.0 provides a reusable model field and a form field for Django to manage lists of email addresses. It stores multiple emails as a single comma-separated string in the database and provides appropriate validation and a dedicated widget for forms. Releases are infrequent but stable, primarily for Django compatibility updates.

Common errors

Warnings

Install

Imports

Quickstart

Defines a Django model (`Contact`) using `ModelMultiEmailField` and a Django form (`ContactForm`) that utilizes `FormMultiEmailField` with `MultiEmailWidget` for managing multiple email addresses. Includes the minimal Django setup required for standalone execution.

import os
from django.conf import settings
from django.db import models
from django import forms
from multi_email_field.fields import MultiEmailField as ModelMultiEmailField
from multi_email_field.forms import MultiEmailField as FormMultiEmailField
from multi_email_field.widgets import MultiEmailWidget

# Minimal Django setup (required for models/forms to be defined outside a full project)
if not settings.configured:
    settings.configure(
        INSTALLED_APPS=[
            'django.contrib.auth',
            'django.contrib.contenttypes',
            'my_app', # A dummy app for model registration
        ],
        DATABASES={'default': {'ENGINE': 'django.db.backends.sqlite3', 'NAME': ':memory:'}},
        DEBUG=True,
    )
    # Required for Django apps to be ready for model creation
    import django
    django.setup()

# Define a placeholder app to allow models to be registered
class MyAppConfig(object):
    name = 'my_app'
    label = 'my_app'

# Example Model integrating MultiEmailField
class Contact(models.Model):
    name = models.CharField(max_length=100)
    emails = ModelMultiEmailField(blank=True, default='')

    def __str__(self):
        return self.name

# Example Form using MultiEmailField and its widget
class ContactForm(forms.ModelForm):
    emails = FormMultiEmailField(
        widget=MultiEmailWidget(attrs={'rows': 3, 'placeholder': 'email1@example.com, email2@test.org'})
    )

    class Meta:
        model = Contact
        fields = ['name', 'emails']

# Example usage (uncomment to run in a script):
# from django.core.exceptions import ValidationError
# try:
#     contact_instance = Contact.objects.create(name="Jane Doe", emails="jane@example.com, jane2@test.org")
#     print(f"Created contact: {contact_instance.name} with emails: {contact_instance.emails}")
#     form = ContactForm(instance=contact_instance)
#     print("\n--- ContactForm (edit existing) ---")
#     print(form.as_p()) # Render the form fields

#     form_data = {'name': 'New User', 'emails': 'user@example.com, another@domain.com'}
#     new_form = ContactForm(form_data)
#     if new_form.is_valid():
#         print("\n--- New ContactForm (valid) ---")
#         new_contact = new_form.save()
#         print(f"Saved new contact: {new_contact.name} with emails: {new_contact.emails}")
#     else:
#         print("New form errors:", new_form.errors)

#     invalid_form_data = {'name': 'Bad User', 'emails': 'invalid-email, user@domain.com'}
#     invalid_form = ContactForm(invalid_form_data)
#     if not invalid_form.is_valid():
#         print("\n--- Invalid ContactForm (expected errors) ---")
#         print("Invalid form errors:", invalid_form.errors)
# except Exception as e:
#     print(f"An error occurred during example usage: {e}")

view raw JSON →