Como é que um add padrão valores (ocultas) para formar modelos no Django?

votos
7

Dada a modelos de classe django.db:

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

onde se deseja criar um novo P com um tipo especificado, ou seja, como é que se faz tipo de ser um padrão, campo oculto (do usuário), onde type é dado likeso:

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

De modo que na forma nenhum campo tipo vai aparecer, mas quando o P é salvo, seu tipo terá id 3 (ie Type.objects.get (pk = 3)).

Em segundo lugar, como é que um (e é possível) especificar um tipo de default na URL, via urls.py, ao usar views genéricas do Django, viz.

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

Descobri que terrivelmente difícil de descrever, que pode ser parte do problema. :) de entrada é muito apreciada!

Publicado 07/11/2008 em 05:27
fonte usuário
Em outras línguas...                            


3 respostas

votos
8

O Widget django.forms.widgets.HiddenInputirá tornar o seu campo como escondido.

Na maioria dos casos, eu acho que você verá que qualquer valor oculto de formulário também pode ser especificado como um parâmetro url em seu lugar. Em outras palavras:

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

e em urls.py:

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

Eu prefiro esta técnica mim porque eu realmente só me vejo precisando campos do formulário escondidos quando eu preciso para rastrear a chave primária de uma instância de modelo - caso em que uma url "editar / pkey" serve os propósitos de ambos iniciando a editar / devolução do formulário e receber o POST ao salvar.

Respondeu 07/11/2008 em 06:26
fonte usuário

votos
5

Para ter um padrão de chave estrangeira em um 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()

Note que o uso pk=xé muito feio, como idealmente você não deve se preocupar que a chave primária é igual. Tente chegar ao objeto desejado por algum outro atributo.

Aqui está como você colocar defaults em seus urls:

# 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.

No exemplo acima, os dois padrões de URL apontam para a mesma visão - blog.views.page - mas o primeiro padrão não captura nada da URL. Se o primeiro padrão corresponde, a função de página () usará seu argumento padrão para num, "1". Se o segundo padrão corresponder, page () usará o valor de num foi capturado pela expressão regular.

Respondeu 07/11/2008 em 05:32
fonte usuário

votos
2

Se você vai com abordagem de incluir o valor oculto na url de Andrew e ainda quiser usar um dos Django é construído em modelos de formulário, existem maneiras para que você exclua o campo oculto.

http://docs.djangoproject.com/en/1.1/topics/forms/modelforms/#using-a-subset-of-fields-on-the-form

Respondeu 21/12/2009 em 00:16
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more