How to DRY (myself) in Django form for Create and Edit Form -
i created 2 forms in django same model, named accountcreateform
, accounteditform
. account
model has 3 fields , each of them has few form attributes such max_length
, help_text
, error_messages
. example,
class accountcreateform(forms.modelform): name = forms.charfield(max_length=50, required=true, label='account name', help_text='50 characters max', error_messages={'required': 'please enter account name'}) number = forms.charfield(max_length=16, required=true, label='phone number', help_text='10-16 digits max', error_messages={'required': 'please enter phone numbername'})
i want user able edit existing accounts well. so, added form editing purposes follow.
class accounteditform(forms.modelform): name_error = { 'max_length': ("name should no longer 50 characters."), 'required': ("please enter account name")} number_error = {'max_length': ("phone number should between 10-16 characters."),'min_length': ("phone number should between 10-16 characters."),'required': ("please enter phone number tied twilio account")} name = forms.charfield(max_length=50, required=true, label='account name', help_text='50 characters max', error_messages=name_error) number = forms.charfield(max_length=16, required=true, label='phone number', help_text='10-16 digits max', error_messages=number_error)
and template both account_create.html
, account_edit.html
share simple code this:
<form method="post"> {% csrf_token %} <p> {% field in form %} {{ field.errors }} <label for="{{ field.id_for_label }}">{{ field.label }}({{ field.help_text }}):</label> <br /> {{ field }}<br /><br /> {% endfor %} </p> <input class="btn btn-primary done-btn" type="submit" value="create new account"> </form>
it works fine , django helps provide error messages , texts fine. but, feel i'm repeating things here. tried approach suggested django documentation page this:
class accounteditform(forms.modelform): class meta: model = account fields = ('name', 'number') labels = {'name' : _('account name'), 'number': _('phone number')} error_messages = { 'name': { 'max_length': _("name should no longer 50 characters."), 'required': ....}
and on. if intentionally left, name
field, blank in edit form, django doesn't show error. way it'll show error seems first approach. there can improve code quality (that is, not repetitive)? thank you.
there can 2 ways accomplish this:-
1) make name field required inside model adding 'blank=false'.
name = models.charfield(blank=false)
2) if don't want modify blank setting fields inside models (doing break normal validation in admin site), can following in form class:
def __init__(self, *args, **kwargs): super(accounteditform, self).__init__(*args, **kwargs) self.fields["name"].required = true
Comments
Post a Comment