如何在Django中添加默认(隐藏)值以形成模板?

时间:2008-11-07 04:27:15

标签: python django django-templates django-urls

给出一个Django.db模型类:

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

其中一个人希望创建一个具有指定类型的新P,即如何使“type”成为默认的隐藏字段(来自用户),其中type为:?

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

因此,在形式中不会出现“type”字段,但是当P被保存时,其类型将具有id 3(即Type.objects.get(pk = 3))。

其次,当使用通用Django视图时,一个(并且可能)通过urls.py在URL中指定“默认”类型,即

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

我发现非常难以描述,这可能是问题的一部分。 :)输入非常感谢!

3 个答案:

答案 0 :(得分:8)

小部件django.forms.widgets.HiddenInput会将您的字段呈现为隐藏。

在大多数情况下,我认为您会发现任何隐藏的表单值也可以指定为url参数。换句话说:

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

并在urls.py中:

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

我自己更喜欢这种技术,因为当我需要跟踪模型实例的主键时,我才真正发现自己需要隐藏的表单字段 - 在这种情况下,“edit / pkey”url用于启动编辑/返回表单,并在保存时接收POST。

答案 1 :(得分:5)

要在模型中使用默认外键:

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非常难看,因为理想情况下,您不应该关心主键是什么。尝试通过其他属性获取所需的对象。

Here如何将默认值放在网址中:

# 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 :(得分:2)

如果你采用Andrew的方法在网址中包含隐藏值并且仍然想要使用Django的内置表单模板,那么有一些方法可以排除隐藏字段。

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