2008-09-29 5 views
3

On suppose les éléments suivants:Existe-t-il un moyen de définir quels champs du modèle sont modifiables dans l'application d'administration?

models.py

class Entry(models.Model): 
    title = models.CharField(max_length=50) 
    slug = models.CharField(max_length=50, unique=True) 
    body = models.CharField(max_length=200) 

admin.py

class EntryAdmin(admin.ModelAdmin): 
    prepopulated_fields = {'slug':('title',)} 

Je veux que le lingot soit prérempli par le titre, mais je ne veulent que l'utilisateur puisse le modifier depuis l'admin. J'ai supposé que l'ajout des champs = [] à l'objet d'administration et ne comprenant pas la limace aurait travaillé, mais il n'a pas. J'ai également essayé de placer editable = False dans le modèle, mais cela n'a pas fonctionné non plus (infact, arrête la page du rendu).

Pensées?

+0

Il est un très mauvais idée puisque les limaces devraient être uniques. – nosklo

Répondre

4

Pour ce cas particulier, vous pouvez remplacer votre méthode de sauvegarde pour slugifier (c'est la méthode intégrée, regardez la source django) le titre et le stocker dans le champ slug. Aussi à partir de là, vous pouvez facilement vérifier si cette limace est en effet unique et la changer d'une manière ou d'une autre si ce n'est pas le cas.

Considérons cet exemple:

def save(self): 
    from django.template.defaultfilters import slugify 

    if not self.slug: 
     self.slug = slugify(self.title) 

    super(Your_Model_Name,self).save() 
+0

J'espérais qu'il y avait un django intégré pour le faire ... ne le devinez pas. Merci! – ashchristopher

+1

N'oubliez pas de prendre ** kwargs dans votre sauvegarde surchargée et passez-le à l'appel super (...). Save(). –

0

Je ne suis pas sûr que ce que vous demandez est possible. Votre meilleur pari est probablement de cacher complètement le slug de l'interface admin en spécifiant vos fieldsets, et en remplaçant la méthode save pour copier le slug du tile, et en le sluguant potentiellement ...

0

Ce Django Snippet fait ce que vous voulez en définissant un widget en lecture seule personnalisé. Vous définissez donc un éditeur personnalisé pour le champ qui ne permet en fait aucune modification.

0

This snippet vous donne un AutoSlugField exactement le comportement que vous cherchez, et l'ajouter à votre modèle est un one-liner.

0

En plus de remplaçant save pour fournir la valeur générée que vous voulez, vous pouvez également utiliser l'option exclude dans votre classe ModelAdmin pour empêcher le champ d'être affiché dans l'admin:

class EntryAdmin(admin.ModelAdmin): 
    exclude = ('slug',) 
+0

Cela ne semble pas fonctionner avec une limace qui utilise une pré-population. "Impossible de concaténer les objets 'str' et 'list'" – ashchristopher

Questions connexes