Dave Anderson
Dave Anderson

Reputation: 12294

Django ModelAdmin extra input field not from Model

I'm trying to add an extra input to a admin.ModelAdmin for a model I have so I can record some optional text when another input has changed.

I can't get the custom ModelForm recognised as name 'EquipmentAdmin' is not defined. I've tried several different ways of importing but think I must have missed something obvious. It feels like there's a circular reference between the EquipmentAdmin and EquipmentAdminForm as they both include a reference to each other in the code.

I have created my Django application Flightdeck and have these all in the same folder;

models.py

from django.db import models

class Location(models.Model):
    name = models.CharField(max_length=45)

class Equipment(models.Model):
    unit_id = models.CharField(max_length=45)
    located = models.ForeignKey(Location)
    located_from = models.DateField()

class EquipmentLocationHistory(models.Model):
    unit = models.ForeignKey(Equipment)
    located = models.ForeignKey(Location)
    start = models.DateField()
    end = models.DateField()
    change_reason = models.CharField(max_length=45)

admin.py

from django.contrib import admin

from flightdeck.models import *
from flightdeck.forms import EquipmentAdminForm

class EquipmentAdmin(admin.ModelAdmin):
    form = EquipmentAdminForm

    def save_model(self, request, obj, form, change):
        if 'located' in form.changed_data:
            try:
                old = Equipment.objects.get(unit_id=obj.unit_id)
            except Equipment.DoesNotExist:
                old = None

        if old:
            if 'located' in form.changed_data:
                located_history = EquipmentLocationHistory(unit=obj, located=old.located, start=old.located_from, end=obj.located_from)
                located_history.save()

        obj.save()

forms.py

from django import forms
from django.contrib import admin

class EquipmentAdminForm(forms.ModelForm):
    reason = forms.CharField()

    class Meta:
        model = EquipmentAdmin

I would like to include the reason value when I add the EquipmentLocationHistory but can't test what I have as the EquipmentAdminForm isn't loaded.

Upvotes: 1

Views: 878

Answers (1)

EquipmentAdmin is not a model. Your ModelForm needs to reference Equipment

from django import forms
from django.contrib import admin
from flightdeck.models import Equipment

class EquipmentAdminForm(forms.ModelForm):
    reason = forms.CharField()

    class Meta:
        model = Equipment

PS: when you have circular references, there are many ways around the problem. The best way with model imports and django is to use django.db.models.get_model('app', 'model')

Upvotes: 3

Related Questions