2008-11-07 34 views
7

给定一个Django.db模型类:如何在Django中添加默认(隐藏)值以形成模板?

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

,其中一个希望创建一个新的P与指定的类型,即怎样才能实现“类型”是默认,隐藏字段(从用户) ,其中类型是likeso给出:

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

,以便在没有“类型”字段将出现的形式,但是当P被保存,它的类型都会有标识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'), 
) 

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

回答

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值。

8

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

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

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

和urls.py:

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

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