2008-11-07 5 views
7

Dada una clase Django.db modelos:¿Cómo se pueden agregar valores predeterminados (ocultos) para formar plantillas en Django?

class P(models.Model): 
    type = models.ForeignKey(Type) # Type is another models.Model class 
    name = models.CharField() 

donde se desea crear un nuevo P con un tipo especificado, es decir, ¿cómo hacer "tipo" para ser un defecto, campo oculto (del usuario) , donde tipo es dado likeso:

http://x.y/P/new?type=3 

Así que en la forma aparecerá ningún campo "tipo", pero cuando se guarda el P, su tipo tendrá ID 3 (es decir Type.objects.get (pk = 3)).

En segundo lugar, ¿cómo puede uno (&) especificar un tipo "predeterminado" en la url, a través de urls.py, al usar vistas genéricas de Django, viz.

urlpatterns = ('django.generic.views.create_update', 
    url(r'^/new$', 'create_object', { 'model': P }, name='new_P'), 
) 

Encontré eso terriblemente difícil de describir, que puede ser parte del problema. :) ¡La entrada es muy apreciada!

Respuesta

5

Tener un defecto clave externa en un modelo:

mydefault = Type.objects.get(pk=3) 

class P(models.Model): 
    type = models.ForeignKey(Type, default=mydefault) # Type is another models.Model class 
    name = models.CharField() 

Tenga en cuenta que el uso de pk=x es bastante feo, ya que lo ideal es que no le debe importar lo que la clave principal es igual. Intenta llegar al objeto que quieras mediante algún otro atributo.

Here 's cómo se pone por defecto en sus URL:

# URLconf 
urlpatterns = patterns('', 
    (r'^blog/$', 'blog.views.page'), 
    (r'^blog/page(?P<num>\d+)/$', 'blog.views.page'), 
) 

# View (in blog/views.py) 
def page(request, num="1"): 
    # Output the appropriate page of blog entries, according to num. 

En el ejemplo anterior, ambos patrones de URL apuntan a la misma vista - blog.views.page - pero el primer patrón no captura nada de la URL. Si el primer patrón coincide, la función page() usará su argumento predeterminado para num, "1". Si el segundo patrón coincide, page() usará cualquier valor num que haya sido capturado por la expresión regular.

8

El widget django.forms.widgets.HiddenInput representará su campo como oculto.

En la mayoría de los casos, creo que encontrará que cualquier valor oculto del formulario también podría especificarse como un parámetro de URL en su lugar. En otras palabras:

<form action="new/{{your_hidden_value}}" method="post"> 
.... 
</form> 

y en urls.py:

^/new/(?P<hidden_value>\w+)/ 

prefiero esta técnica mí mismo, porque lo único que realmente encuentro que necesitan campos de formulario ocultos cuando tengo que realizar un seguimiento de la clave primaria de un modelo instancia - en cuyo caso una url "edit/pkey" sirve tanto para iniciar la edición/devolución del formulario como para recibir la POST al guardar.

Cuestiones relacionadas