【问题标题】:How does one add default (hidden) values to form templates in Django?如何在 Django 中向表单模板添加默认(隐藏)值?
【发布时间】:2010-09-21 05:42:32
【问题描述】:

给定一个 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 被保存时,其类型的 id 为 3(即 Type.objects.get(pk=3))。

其次,当使用通用 Django 视图时,如何(以及是否可能)在 url 中指定“默认”类型,通过 urls.py,即。

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

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

【问题讨论】:

    标签: python django django-templates django-urls


    【解决方案1】:

    如果您采用 Andrew 在 url 中包含隐藏值的方法,但仍想使用 Django 的内置表单模板之一,那么您可以通过多种方式排除隐藏字段。

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

    【讨论】:

      【解决方案2】:

      小部件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。

      【讨论】:

        【解决方案3】:

        在模型中有一个默认的外键:

        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 是您在 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 值。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-02-16
          • 2011-01-28
          • 2022-08-13
          • 2011-05-25
          相关资源
          最近更新 更多