2011-02-03 17 views
8

Quiero generar una babosa al azar para mi modelo, pero sin establecer "en blanco = True" (como yo quiero cumplir más tarde con la validación.)Django - Generar babosa por defecto

Me preguntaba si podía hacer algo como esto:

slug = models.SlugField(unique=True, default=some_method(), verbose_name='URL Slug') 

¿Dónde some_method es un método que genera una babosa aleatoria? He probado el código anterior y no funciona :(

Lo que me gustaría hacer es generar una babosa único (unique_slugify?)

+0

Esto llama al método cuando se crea el objeto, ¿es esto así? – jbcurtin

+0

Sí, aunque no funciona ... NameError: name 'some_method' no está definido – Hanpan

Respuesta

8

Se podría anular el método de modelos salvar de manera que cuando . se crea una nueva entidad, se genera la babosa sobre la marcha Algo así como:

if not self.pk: 
    self.slug = ''.join(random.sample(string.ascii_lowercase, 10)) 

usted podía hacer eso, pero no es muy buena y mejor sería dejar que la bala sea un slugified determinista versión del nombre de los objetos.

+0

No me importa si ese es el caso, estoy confundido en cuanto a cómo lo configuré como predeterminado . No estoy usando el panel de administración – Hanpan

+0

una cadena aleatoria no es buena para la unicidad, mejor para seguir con algo como el resumen de (marca de tiempo en combinación con el azar) –

+0

Gracias. No quería sobrescribir el método de guardar, pero parece que es inevitable. Tommaso, si tienes un ejemplo de lo que quieres decir, te agradecería. – Hanpan

1

¿Quizás la validación del modelo puede ayudar? http://docs.djangoproject.com/en/dev/ref/models/instances/

Puede simplemente validar el valor que debe escribirse en un campo slug y si ya existe, generar algo único.

Igualmente, la solución podría ser anular el método de guardar modelos.

Saludos.

0

buscar en Google, encontré pregunta similar: How to use slug in django

creo por lo que el mejor enfoque es reescribir el método Save, y Validade el campo de formulario.

Pero, slug debe ser único, por lo que generar cadenas al azar no es bueno! Como dice temprano Tommaso Bardugi, si agrega la marca de tiempo en la url, esto se resuelve.

19

Puede utilizar esto cuando desee que su babosa se genere automáticamente con la entrada realizada en algún otro campo en el mismo modelo, donde se encuentra la babosa.

from django_extensions.db.fields import AutoSlugField 

slug = AutoSlugField(_('slug'), max_length=50, unique=True, populate_from=('name',)) 
  • populate_from es el campo en el modelo que se auto generar la babosa
+4

Para aquellos que no lo saben, parece que el módulo django_extensions es de la biblioteca del mismo nombre: http://packages.python.org/django-extensions/# – MrOodles

2

default tiene que ser un valor o una invocable.
Así que es default=some_method, no default=some_method(). Aquí hay un ejemplo:

from django.contrib.auth.models import UserManager 

def randomString(): 
    um = UserManager() 
    return(um.make_random_password(length=25)) 

class Foo(models.Model): 
    code = models.CharField(max_length=25, default=randomString) 
+0

Interesante, usando 'random.random' no trabajo Obtuve un error 'Can not serialize function', pero esta función personalizada sí. – Flimm