2010-04-21 78 views
5

estoy atando para ocultar mis campos Slug en el administrador mediante el establecimiento de editable = False pero cada vez que lo hago me sale el siguiente error:Ocultar campos en Django administrador

KeyError at /admin/website/program/6/ 
Key 'slug' not found in Form 
Request Method: GET 
Request URL: http://localhost:8000/admin/website/program/6/ 
Exception Type: KeyError 
Exception Value:  
Key 'slug' not found in Form 
Exception Location: c:\Python26\lib\site-packages\django\forms\forms.py in __getitem__, line 105 
Python Executable: c:\Python26\python.exe 
Python Version: 2.6.4 

Alguna idea de por qué esto que está sucediendo

+0

¿Puede mostrar su modelo y su modelo, forma y vista, por favor? – Brant

+0

Los puse en dpaste http://dpaste.com/186243/ – jwesonga

Respuesta

8

no puedo hablar con su error exacto pero esta trabajado para mí ...

from django.template.defaultfilters import slugify 
# Create your models here. 

class Program(models.Model): 
    title=models.CharField(max_length=160,help_text="title of the program") 
    description=models.TextField(help_text="Description of the program") 
    slug=models.SlugField(max_length=160,blank=True,editable=False) 

    def __unicode__ (self): 
     return self.title 

    class Meta: 
     verbose_name="KCDF Program" 
     verbose_name_plural="KCDF Programs" 

    def save(self): 
     self.slug = slugify(self.title) 
     super(Program,self).save() 

    def get_absolute_url(self): 
     return "/program/%s/" % self.slug 

que azotará que un campo de desechos cuando se guarda el modelo.

acaba de salir de la cosa rellenar de forma automática en el ModelAdmin.

tuve que correr en el admin sin ningún problema.

+0

lo probé y funcionó !! .. Creo que prepopulated_fields = {"slug": ("title",)} fue el problema, una vez que lo eliminé y reestructuré mis modelos usando el ejemplo anterior que funcionó.Pude agregar exclude ('slug',) en el modeloAdmin y ocultarlo al usuario. – jwesonga

4

se aconseja que hacer reserva de la aduana el método de modelos con argumentos adicionales.

Así que el código sería como el siguiente:

def save(self, *args, **kwargs): 
    self.slug = slugify(self.title) 
    super(YourModel, self).save(*args, **kwargs) 
1

En lugar de utilizar editable=False sólo les ocultó en el admin:

from django.contrib import admin 

class MyModelAdmin(admin.ModelAdmin): 
    exclude = ('slug',) 

También puede hacer que sea lo que la babosa ahorra usando el "nombre "campo de su modelo (o cualquier campo que desee) y solo se guarda una vez cuando crea esa instancia usando slugify de la siguiente manera en su models.py:

from django.template.defaultfilters import slugify 

class MyModel(models.Model): 
# model fields 
... 
    def save(self, *args, **kwargs): 
     if not self.id: 
      self.slug = slugify(self.name) 

     super(Product, self).save(*args, **kwargs) 
1

Sé que esto es una pregunta muy antigua, pero escribo esto para futuras referencias.

Si lo que desea es ocultar algo en el sitio de administración usando CSS, se puede utilizar cualquier clase que ya tiene display:none o similar.

En Django 1.6.5 forms.css se puede encontrar:

.empty-form { 
    display: none; 
} 

por lo que en sus conjuntos de campos, agregar un grupo de campos ocultos utilizando -forma vacía clase como esta:

fieldsets = [ 
     [_('Visible class'), { 
      'classes' : ['any class for them',], 
      'description' : '', 
      'fields' : [['visible fields 1',], 
         ['visible fields 2',], 
      ], 
     }], 
     [None, { 
      'classes' : ['empty-form',], 
      'fields' : ['hidden fields here',], 
     }], 
    ] 

En mi caso estoy usando grappelli, entonces uso la clase ui-helper-hidden en su lugar

Ten un buen día.

+0

¡Gracias por señalar esto! – Moritz

5

Mi solución justa no oculta el campo babosa, pero permite cambiar la babosa, cuando aún no se ha guardado. El problema es que los campos utilizados en prepopulated_fields, deben tener el formato, pero no están allí si son de solo lectura. Esto se resuelve configurando solo prepopulated_fields si solo se ha configurado.

class ContentAdmin(admin.ModelAdmin): 
    def get_readonly_fields(self, request, obj=None): 
     if obj: 
      return ('slug',) 
     return() 
    def get_prepopulated_fields(self, request, obj=None): 
     if not obj: 
      return {'slug': ('title',)} 
     return {} 
Cuestiones relacionadas