Учитывая класс моделей Django.db:
class P(models.Model):
type = models.ForeignKey(Type) # Type is another models.Model class
name = models.CharField()
где нужно создать новый P с указанным типом, то есть как сделать "тип" скрытым полем по умолчанию (от пользователя), где тип задается так:
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'),
)
Я обнаружил, что это ужасно сложно описать, что может быть частью проблемы. :) Вход очень ценится!






Чтобы иметь в модели внешний ключ по умолчанию:
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.
In the above example, both URL patterns point to the same view -- blog.views.page -- but the first pattern doesn't capture anything from the URL. If the first pattern matches, the page() function will use its default argument for num, "1". If the second pattern matches, page() will use whatever num value was captured by the regex.
Виджет 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 при сохранении.
Если вы согласны с подходом Эндрю, включающим скрытое значение в URL-адрес, и по-прежнему хотите использовать один из встроенных в Django шаблонов форм, у вас есть способы исключить скрытое поле.
http://docs.djangoproject.com/en/1.1/topics/forms/modelforms/#using-a-subset-of-fields-on-the-form