Как добавить значения по умолчанию (скрытые) в шаблоны форм в Django? - PullRequest
7 голосов
/ 07 ноября 2008

Учитывая класс моделей Django.db:

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

, где кто-то хочет создать новый P с указанным типом, то есть как сделать «тип» скрытым полем по умолчанию (от пользователя), где типу дано likeo:

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

Так что в форме поле «тип» не появится, но при сохранении P его тип будет иметь идентификатор 3 (то есть Type.objects.get (pk = 3)).

Во-вторых, как можно (и возможно ли) указать тип «по умолчанию» в URL-адресе, через urls.py, при использовании общих представлений Django, а именно

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

Я обнаружил, что это ужасно сложно описать, что может быть частью проблемы. :) Вклад очень ценится!

Ответы [ 3 ]

8 голосов
/ 07 ноября 2008

Виджет django.forms.widgets.HiddenInput сделает ваше поле скрытым.

В большинстве случаев, я думаю, вы обнаружите, что любое скрытое значение формы также может быть указано в качестве параметра url. Другими словами:

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

и в urls.py:

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

Я предпочитаю эту технику самостоятельно, потому что мне действительно нужны скрытые поля формы, когда мне нужно отследить первичный ключ экземпляра модели - в этом случае URL "edit / pkey" служит как для инициации редактирования / возврат формы и получение POST при сохранении.

5 голосов
/ 07 ноября 2008

Чтобы иметь внешний ключ по умолчанию в модели:

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()

Обратите внимание, что использование pk=x довольно уродливо, так как в идеале вам не важно, каков первичный ключ. Попробуйте добраться до нужного объекта по другому атрибуту.

Здесь , как вы вводите значения по умолчанию в ваших 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.

В приведенном выше примере оба шаблона URL указывают на одно и то же представление - blog.views.page - но первый шаблон ничего не захватывает из URL. Если первый шаблон соответствует, функция page () будет использовать свой аргумент по умолчанию для num, «1». Если второй шаблон соответствует, page () будет использовать любое значение num, захваченное регулярным выражением.

2 голосов
/ 21 декабря 2009

Если вы придерживаетесь подхода Эндрю, включающего скрытое значение в URL, и по-прежнему хотите использовать один из встроенных шаблонов форм Django, есть способы исключить скрытое поле.

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

...