Adding custom fields in model in django admin
In forms.py
:
from django.forms import ModelForm
from .models import YourModel
class YourModelForm(forms.ModelForm):
extra_field = forms.CharField()
def save(self, commit=True):
extra_field = self.cleaned_data.get('extra_field', None)
# ...do something with extra_field here...
return super(YourModelForm, self).save(commit=commit)
class Meta:
fields = '__all__'
model = YourModel
In admin.py
:
from .models import YourModel
from .forms import YourModelForm
class YourModelAdmin(admin.ModelAdmin):
form = YourModelForm
admin.site.register(YourModel, YourModelAdmin)
Add foreign key choices field with plus button
from django.core.urlresolvers import reverse
from django.utils.safestring import mark_safe
from django.forms import widgets
from django.conf import settings
from django.utils.translation import gettext as _
class RelatedFieldWidgetCanAdd(widgets.Select):
def __init__(self, related_model, related_url=None, *args, **kw):
super(RelatedFieldWidgetCanAdd, self).__init__(*args, **kw)
if not related_url:
rel_to = related_model
info = (rel_to._meta.app_label, rel_to._meta.object_name.lower())
related_url = 'admin:%s_%s_add' % info
# Be careful that here "reverse" is not allowed
self.related_url = related_url
def render(self, name, value, *args, **kwargs):
self.related_url = reverse(self.related_url)
output = [super(RelatedFieldWidgetCanAdd, self).render(name, value, *args, **kwargs)]
#output.append(u'<a href="%s?_to_field=id&_popup=1" class="add-another" id="add_id_%s" > ' % \
output.append(u'<a href="%s?_to_field=id&_popup=1" class="add-another" id="add_id_%s" onclick="return showAddAnotherPopup(this);"> ' % \
(self.related_url, name))
output.append(u'<img src="%sadmin/img/icon_addlink.gif" width="10" height="10" alt="%s"/></a>' % (settings.STATIC_URL, _('Add Another')))
return mark_safe(u''.join(output))
class YourModelForm(forms.ModelForm):
field_name = forms.ModelChoiceField(
required=True,
queryset=ModelName.objects.all(),
widget=RelatedFieldWidgetCanAdd(ModelName)
)
class Meta:
fields = '__all__'
model = YourModel