Pregunta

class Foo(models.Model):
    title = models.CharField(max_length=20)
    slug = models.SlugField()

¿Existe una forma integrada de hacer que el campo de slug se rellene automáticamente en función del título? Tal vez en el administrador y fuera del administrador.

¿Fue útil?

Solución

para Admin en Django 1.0 y versiones posteriores, deberías usar

prepopulated_fields = {'slug': ('title',), }

en tu admin.py

Su clave en el diccionario prepopulated_fields es el campo que desea llenar, y el valor es una tupla de campos que desea concatenar.

Fuera de admin, puede usar la función slugify en sus vistas. En las plantillas, puede utilizar el filtro | slugify .

También existe este paquete que se encargará de esto automáticamente: https: //pypi.python .org / pypi / django-autoslug

Otros consejos

Fuera del administrador, consulte este fragmento de django . Póngalo en su .save () , y funcionará con los objetos creados mediante programación. Dentro del administrador, como han dicho los demás, use prepopulated_fields .

Para pre-1.0:

slug = models.SlugField(prepopulate_from=('title',))

debería funcionar bien

Para 1.0, use camflan's

También puede usar la señal de django pre_save para rellenar slug fuera del código de administración de django. Consulte la documentación de señales de Django .

La validación de la singularidad del slug Ajax también será útil, consulte As-You-Type Slug Validación de la unicidad @ Exuberancia irracional

autoslug me ha funcionado bastante bien en el pasado. Aunque nunca he intentado usarlo con la aplicación de administración.

Pensé que agregaría una respuesta completa y actualizada con los errores mencionados:

1. Rellene automáticamente los formularios en Django Admin

Si solo le preocupa agregar y actualizar datos en el administrador, puede simplemente usar prepopulated_fields atributo

class ArticleAdmin(admin.ModelAdmin):
    prepopulated_fields = {"slug": ("title",)}

admin.site.register(Article, ArticleAdmin)

2. Rellenar automáticamente formularios personalizados en plantillas

Si ha creado su propia interfaz representada por el servidor con formularios, puede rellenar automáticamente los campos utilizando el | slugify tamplate o el filtro slugify para guardar el formulario (is_valid).

3. Rellenar automáticamente campos de slug a nivel de modelo con django-autoslug

Las soluciones anteriores solo completarán automáticamente el campo slug (o cualquier campo) cuando los datos se manipulen a través de esas interfaces (el administrador o un formulario personalizado). Si tiene una API, comandos de administración o cualquier otra cosa que también manipule los datos que necesita desplegar a nivel de modelo.

django-autoslug proporciona los campos de campo AutoSlugField que amplían SlugField y le permiten configurar en qué campo debe slugificar prolijamente:

class Article(Model):
    title = CharField(max_length=200)
    slug = AutoSlugField(populate_from='title')

El campo utiliza señales de pre_save y post_save para lograr su funcionalidad, por lo que debe ver el texto gotcha al final de esta respuesta.

4. Rellenar automáticamente campos de slug a nivel de modelo anulando guardar ()

La última opción es implementar esto usted mismo, lo que implica anular el método predeterminado de guardar ():

    class Article(Model):
        title = CharField(max_length=200)
        slug = SlugField()

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

NOTA: las actualizaciones masivas omitirán su código (incluidas las señales)

Este es un error de comprensión común entre los principiantes y Django. Primero debe saber que las señales pre_save y post_save están directamente relacionadas con el método save (). En segundo lugar, las diferentes formas de hacer actualizaciones masivas en Django evitan el método save () para lograr un alto rendimiento, operando directamente en la capa SQL. Esto significa que para el modelo de ejemplo utilizado en las soluciones 3 o 4 anteriores:

  • Article.objects.all (). update (title = 'New post') NOT actualizará la bala de cualquier artículo
  • Utilizando bulk_create o bulk_update en el modelo del artículo NOT actualizar la bala de cualquier artículo.
  • Dado que no se llama al método save (), no se emitirán señales de pre_save o post_save .

Para realizar actualizaciones masivas y seguir utilizando restricciones de nivel de código, la única solución es iterar los objetos uno por uno y llamar a su método save (), que tiene un rendimiento drásticamente menor que las operaciones masivas de nivel SQL. Por supuesto, podría utilizar los desencadenantes en su base de datos, aunque ese es un tema totalmente diferente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top