如何在Django表单模板中添加默认(隐藏)值?
假设你有一个Django的数据库模型类:
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的时候,它的类型会是id为3的(也就是Type.objects.get(pk=3))。
另外,怎么在urls.py中指定一个“默认”的类型,使用通用的Django视图时,这样做是否可行呢?
urlpatterns = ('django.generic.views.create_update',
url(r'^/new$', 'create_object', { 'model': P }, name='new_P'),
)
我发现描述这个问题非常困难,这可能也是问题的一部分。:) 非常感谢大家的输入!
3 个回答
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
这种写法并不好,因为理想情况下你不应该关心主键等于什么。尽量通过其他属性来获取你想要的对象。
这里是如何在你的网址中设置默认值的方法:
# 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.
在上面的例子中,两个网址模式都指向同一个视图 -- blog.views.page -- 但是第一个模式没有从网址中捕获任何东西。如果第一个模式匹配,page() 函数将使用它的默认参数 num,值为 "1"。如果第二个模式匹配,page() 将使用正则表达式捕获到的 num 值。
8
这个小工具 django.forms.widgets.HiddenInput
会把你的字段显示为隐藏的。
在大多数情况下,我觉得你会发现,任何隐藏的表单值其实也可以作为网址参数来指定。换句话说:
<form action="new/{{your_hidden_value}}" method="post">
....
</form>
在 urls.py 文件中:
^/new/(?P<hidden_value>\w+)/
我个人更喜欢这种方法,因为我发现自己只在需要跟踪模型实例的主键时才需要隐藏的表单字段。在这种情况下,一个“编辑/pkey”的网址既可以用来开始编辑/返回表单,也可以在保存时接收 POST 请求。