2010-04-21 6 views
5

sto legando a nascondere i miei campi slug in Admin impostando modificabile = False ma ogni volta che faccio che ottengo il seguente errore:Nascondi campi in Django Admin

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 

Qualsiasi idea del perché questo sta accadendo

+0

Puoi mostrare il modello e il modello, il modulo e la visualizzazione per favore? – Brant

+0

Li ho messi su dpaste http://dpaste.com/186243/ – jwesonga

risposta

8

non posso parlare con il vostro errore esatto, ma questo ha funzionato per me ...

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 

che vi frusta un campo slug quando il modello viene salvato.

Lasciare appena la cosa popolata automaticamente in ModelAdmin.

Ho avuto quell'esecuzione nell'amministratore senza problemi.

+0

provato e ha funzionato !! .. Penso che il prepopulated_fields = {"slug": ("title",)} era il problema, una volta I rimosso e ristrutturato i miei modelli utilizzando l'esempio sopra ha funzionato.Sono stato in grado di aggiungere exclude ('slug',) nel modelAdmin e nasconderlo all'utente. – jwesonga

4

Si consiglia di eseguire il metodo di salvataggio personalizzato su modelli CON argomenti aggiuntivi.

modo che il codice sarebbe simile al seguente:

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

Invece di usare editable=False solo nasconderli nel admin:

from django.contrib import admin 

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

E 'possibile fare in modo che il proiettile salva utilizzando il "nome "campo del tuo modello (o qualsiasi campo tu desideri) e salva solo una volta quando crei quell'istanza usando slugify nel modo seguente nel tuo model.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

So che questa è una domanda molto vecchia, ma la scrivo per riferimenti futuri.

Se si desidera nascondere qualcosa nel sito di amministrazione tramite CSS, è possibile utilizzare qualsiasi classe che abbia già display:none o simile.

In Django 1.6.5 forms.css si possono trovare:

.empty-form { 
    display: none; 
} 

Quindi nel tuo fieldsets, aggiungere un gruppo per i campi nascosti utilizzando vuoto-forma classe come questa:

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

Nel mio caso sto usando grappelli, quindi uso la classe ui-helper-hidden anziché

Buona giornata.

+0

Grazie per aver segnalato questo! – Moritz

5

La mia soluzione non si limita a nascondere il campo di lumaca, ma consente di modificare lo slug quando non è stato ancora salvato. Il problema è che i campi utilizzati in prepopulated_fields devono essere nel modulo, ma non sono lì se di sola lettura. Questo è risolto impostando solo prepopulated_fields se readonly non è impostato.

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 {}