2008-10-15 8 views
2

Je veux créer un modèle, qui définira editable = False à la création, et editable = True lors de l'édition de l'élément. Je pensais que ce devrait être quelque chose comme ceci:variables en tant que paramètres dans les options de champ

home = models.ForeignKey(Team, editable=lambda self: True if self.id else False) 

Mais cela ne fonctionne pas. Peut-être que quelque chose avec la priorité init peut m'aider, mais je ne sais pas ce qui peut faire l'affaire. Je sais que je peux vérifier self.id dans la méthode save(), mais il est trop tard, je veux ce genre de logique dans l'application d'administration lorsque je remplis les champs im.

Répondre

4

Ajoutez ce qui suit (une petite extension de this code) à votre admin.py:

from django import forms 

class ReadOnlyWidget(forms.Widget): 
    def __init__(self, original_value, display_value): 
     self.original_value = original_value 
     self.display_value = display_value 

     super(ReadOnlyWidget, self).__init__() 

    def render(self, name, value, attrs=None): 
     if self.display_value is not None: 
      return unicode(self.display_value) 
     return unicode(self.original_value) 

    def value_from_datadict(self, data, files, name): 
     return self.original_value 

class ReadOnlyAdminFields(object): 
    def get_form(self, request, obj=None): 
     form = super(ReadOnlyAdminFields, self).get_form(request, obj) 
     fields = getattr(self, 'readonly', []) 
     if obj is not None: 
      fields += getattr(self, 'readonly_on_edit', []) 

     for field_name in fields: 
      if field_name in form.base_fields: 
       if hasattr(obj, 'get_%s_display' % field_name): 
        display_value = getattr(obj, 'get_%s_display' % field_name)() 
       else: 
        display_value = None 

       form.base_fields[field_name].widget = ReadOnlyWidget(getattr(obj, field_name, ''), display_value) 
       form.base_fields[field_name].required = False 

     return form 

Vous pouvez ensuite spécifier que certains champs doivent par readonly lorsque l'objet est édité:

class PersonAdmin(ReadOnlyAdminFields, admin.ModelAdmin): 
    readonly_on_edit = ('home',) 

admin.site.register(Person, PersonAdmin) 
Questions connexes