2013-03-11 10 views
0

Lors de l'ajout d'un champ de formulaire supplémentaire à la readonly_fields d'un ModelAdmin je reçois une erreur ImproperlyConfigured lors de l'ouverture de la page d'administration d'une instance de mon modèle:Comment ajouter un champ de formulaire supplémentaire modeladmin à readonly_fields?

TaskClosedAdmin.readonly_fields[0], 'extra_admin_field' is not a callable or an attribute of 'TaskClosedAdmin' or found in the model 'TaskClosed'. 

Comment puis-je ajouter le champ supplémentaire à readonly_fields?

EDIT

J'ai aussi essayé dans le get_form() de TaskClosedAdmin, pensant que les champs peuvent être mis à jour après super(TaskClosedAdmin, self).get_form(request, obj, **kwargs):

def get_form(self, request, obj=None, **kwargs): 
    form = super(TaskClosedAdmin, self).get_form(request, obj, **kwargs) 
    self.readonly_fields = obj._meta.get_all_field_names() 
    self.readonly_fields.append('extra_admin_field') 
    return form 

et je reçois toujours la même erreur au sujet extra_admin_field pas existant .. Où puis-je l'ajouter?

models.py

class Task(models.Model): 

    # some fields 


class TaskToConfirm(Task): 
    class Meta: 
     proxy = True 

admin.py

class TaskForm(forms.ModelForm): 

    extra_admin_field = forms.CharField(max_length=10) 

    class Meta: 
     model = Task 


    def __init__(self, *args, **kwargs): 

     super(TaskForm, self).__init__(*args, **kwargs) 

     # set extra_admin_field value 


class TaskAdmin(admin.ModelAdmin): 

    form = TaskForm 


class TaskClosedAdmin(TaskAdmin): 

    readonly_fields = ('extra_admin_field',) 

Répondre

1

Ce que vous devez faire est d'écrire une lecture seule widget et spécifier directement sur votre formulaire, comme celui-ci :

from ... import ReadOnlyWidget 

class TaskForm(forms.ModelForm): 
    extra_admin_field = forms.CharField(max_length=10) 

    class Meta: 
     model = Task 
     widgets = { 
      'extra_admin_field': ReadOnlyWidget, 
     } 

    def __init__(self, *args, **kwargs): 
     super(TaskForm, self).__init__(*args, **kwargs) 
     # set extra_admin_field value 

Il n'y a en lecture seule widget qui devrait fonctionner (je ne l'ai pas essayé) ici: http://djangosnippets.org/snippets/1682/

+0

Depuis ModelAdmin a un attribut readonly_fields, je suppose que quelque chose de similaire existe déjà dans Django. Je voudrais juste ajouter mon champ supplémentaire à ce readonly_fields. – jul

+0

Ok, vous avez raison, extra_admin_field est un champ de formulaire, pas un champ de modèle, donc je ne peux pas l'ajouter à l'objet modeladmin readonly_fields. – jul

Questions connexes