from django import forms from django.core.exceptions import ValidationError from .models import Item DUPLICATE_ITEM_ERROR = "You've already logged this to your list" EMPTY_ITEM_ERROR = "You can't have an empty list item" class ItemForm(forms.models.ModelForm): class Meta: model = Item fields = ("text",) widgets = { "text": forms.widgets.TextInput( attrs={ "placeholder": "Enter a to-do item", "class": "form-control form-control-lg", } ), } error_messages = {"text": {"required": EMPTY_ITEM_ERROR}} def save(self, for_list): self.instance.list = for_list return super().save() class ExistingListItemForm(ItemForm): def __init__(self, for_list, *args, **kwargs): super().__init__(*args, **kwargs) self.instance.list = for_list def clean_text(self): text = self.cleaned_data["text"] if self.instance.list.item_set.filter(text=text).exists(): raise forms.ValidationError(DUPLICATE_ITEM_ERROR) return text