如何在Django表单模板中添加默认(隐藏)值?

8

给定一个 Django.db 模型类:

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

如果您想创建一个具有指定类型的新P,即如何使"type"成为默认隐藏字段(对用户而言),其中类型如下所示:

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

这样,在表单中就不会出现“类型”字段,但是当保存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个回答

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。


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这种方法比较丑陋,理想情况下您不应该关心主键等于什么。试着通过某些其他属性来获取您想要的对象。
以下是如何在您的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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接