从 Django 中基于类的通用视图自定义表单变量的首选方法是啥?

Posted

技术标签:

【中文标题】从 Django 中基于类的通用视图自定义表单变量的首选方法是啥?【英文标题】:What is the perferred way to customize the form variable from a class-based Generic View in Django?从 Django 中基于类的通用视图自定义表单变量的首选方法是什么? 【发布时间】:2012-04-11 18:49:22 【问题描述】:

我目前正在使用CreateViewOrder

urls.py 的一部分看起来像这样

url(
    r'^orders/create/$',
    CreateView.as_view(
        model = Order,
        template_name = 'doors/orders/create.html'
    ),
    name = 'orders_create'
),

如果我只是在oors/orders/create.html 中执行 form ,那么它将显示在models.py 中声明的所有字段。

自定义每个字段的外观并控制它们是否可见(某些字段是可选的)的最佳方法是什么?

【问题讨论】:

【参考方案1】:

要回答关于模型的哪些字段应在表单中可用的部分问题,您可以使用ModelForm 创建一个自定义表单。 fieldsexclude 选项定义了表单中可用的字段:

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

然后,您可以通过添加 form_class 来告诉 CreateView 使用您的自定义表单:

url(
    r'^orders/create/$',
    CreateView.as_view(
        model = Order,
        template_name = 'doors/orders/create.html',
        form_class = OrderCreateForm,
    ),
    name = 'orders_create'
),

关于问题的第二部分(如何设置表单及其字段的样式),您可以使用 form.as_p form.as_table 或组合一个完全自定义的模板:

https://docs.djangoproject.com/en/dev/topics/forms/#displaying-a-form-using-a-template

【讨论】:

所以我想在models.py 内创建OrderCreateForm 最好将您的自定义表单放在一个名为 forms.py 的模块中(与您的 models.py 处于同一级别。 我正在阅读您链接的文档和their full example put all the form classes right next to the model classes。那么文档给出了一个不好的例子? 嗯,好问题。也许我会在 Django Mailinglist 上问它。大多数时候,我坚持以下约定:streamhacker.com/2011/01/03/django-application-conventions

以上是关于从 Django 中基于类的通用视图自定义表单变量的首选方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

如何根据 Django 中当前基于类的通用视图模型向模板加载器添加路径

django 通用(类)视图中的多个表单类

基于 Django 类的视图:发布表单数据返回 302 Found 状态码

从 Django 中基于类的通用视图将 request.user 对象发送到 ModelForm

基于Django类的视图:发布表单数据返回302 Found状态代码

从Django中基于类的通用视图向ModelForm发送request.user对象