当前位置: 首页 > 面试题库 >

为模型表单额外字段指定小部件(Django)

霍书
2023-03-14
问题内容

我必须在模型表格中添加额外的字段。我的方法是:

class MyForm(forms.ModelForm):
    extra_field = forms.CharField()
    class Meta:
        model = MyModel
        widgets = {
            #Does not work
            'extra_field': forms.Textarea(attrs={'placeholder': u'Bla bla'}),
        }

但似乎忽略了extra_fieldat的小部件定义class Meta,因为我在模板上没有 输入 标签,而是使用了 textarea
。所以我采用下一种方法:

class MyForm(forms.ModelForm):
    #It works fine
    extra_field = forms.CharField(widget=forms.Textarea())
    class Meta:
        model = MyModel

它非常适合我,但是我曾经在class Meta声明时为表单字段指定小部件。所以我想知道:

为什么我的第一种方法不起作用?我做错了什么?


问题答案:

多余的字段无关紧要。这有效:

class FooForm(forms.ModelForm):
    class Meta:
        model = People
        widgets = { 
            'name': forms.Textarea(attrs={'placeholder': u'Bla bla'}),
        }

这不是:

class FooForm(forms.ModelForm):
    name = forms.CharField()

    class Meta:
        model = People
        widgets = { 
            'name': forms.Textarea(attrs={'placeholder': u'Bla bla'}),
        }

确实没有记录,这是我在与该行为有关的文档中可以找到的最好的(也许不是,这只是我可以找到的最好的):

如果你明确实例这样的表单字段,Django的假定你想完全定义其行为 […] 您必须声明表单字段时明确设置相关参数

此行为的实现在django / forms / models.py第219行中:

   204         if opts.model:
   205             # If a model is defined, extract form fields from it.
   206             fields = fields_for_model(opts.model, opts.fields,
   207                                       opts.exclude, opts.widgets, formfield_callback)
   208             # make sure opts.fields doesn't specify an invalid field
   209             none_model_fields = [k for k, v in fields.iteritems() if not v]
   210             missing_fields = set(none_model_fields) - \
EE 211                              set(declared_fields.keys())
   212             if missing_fields:
   213                 message = 'Unknown field(s) (%s) specified for %s'
   214                 message = message % (', '.join(missing_fields),
   215                                      opts.model.__name__)
   216                 raise FieldError(message)
   217             # Override default model fields with any custom declared ones
   218             # (plus, include all the other declared fields).
   219             fields.update(declared_fields)

线路206后,田[“名”。小工具 确实的textarea Meta.widgets规定。

在第219行,使用声明的字段更新字段,并且fields
[‘name’]。widget变为django.forms.widgets.TextInput,这是CharField的默认值。

显然,显式字段定义具有优先权。

感谢您提出问题,很高兴知道,很好的问题。



 类似资料:
  • 给定以下模型: 以及以下模型窗体,其中包含一些用于儿童模型的额外字段: 我有一个有很多孩子的父母模型。我需要使用一些数学来平衡孩子们的体重(每个孩子的最小和最大体重都有一些限制)。因此,我试图创建一个表单集,允许用户输入每个孩子的最小和最大体重,以提交重新平衡。我想在上述表格中指定一个默认的最小重量和一个默认的最大重量。因此,我的观点如下: 然而,当我输出表单时,我为min_weight和max_

  • 问题内容: 我有一个自定义TagField表单字段。 如上所示,它使用TextInput表单字段小部件。但是在管理员中,我希望使用Textarea小部件来显示它。为此,存在钩子,但在这种情况下不起作用。 管理员声明为: 这对表单字段窗口小部件没有影响,并且仍使用TextInput小部件呈现。 问题答案: django管理员对其许多字段使用自定义窗口小部件。覆盖字段的方法是创建一个供ModelAdm

  • 问题内容: 我有这两个课(表) 还有这个: 运行此代码后,在数据库(student_course)中创建了一个额外的表,现在我想知道如何在该表中添加额外的字段,例如(Grade,Date和…(我的意思是student_course表)),我看到了一些解决方案,但我不喜欢它们,而且我对它们有一些问题: 第一个样品 问题答案: 如果在链接表(STUDENT_COURSE)上添加额外的字段,则必须根据s

  • 问题内容: 我正在遍历表单的字段,对于某些字段,我希望布局略有不同,需要更改HTML。 为了准确地做到这一点,我只需要知道小部件类型。它的类名或类似名称。在标准python中,这很容易! 不幸的是,你不允许访问模板中的下划线变量。大! 你可以进行测试,但这仅适用于文本/密码类型。我需要更多的分辨率。 对我而言,无论看起来多么困难,在模板级别执行此操作都是最有意义的。我已经将处理字段的HTML的部分

  • 我希望有人能帮我创建我需要的查询。我引用这个留档的元素或额外的小部件,“额外的帖子”:https://developers.elementor.com/custom-query-filter/ 现在,我可以在编辑器中设置查询以显示来自多个类别的帖子。问题是,查询显示来自“红色”或“蓝色”的帖子。我需要查询来显示标记为“红色”和“蓝色”的帖子。 我使用自定义帖子类型和自定义类别,这似乎是有意义的例子

  • 问题内容: 我的模型中有一个DateTimeField字段。我想将其显示为Django管理站点中的复选框小部件。为此,我创建了一个自定义表单小部件。但是,我不知道如何仅将我的自定义窗口小部件用于这一字段。 在Django文档解释了如何使用自定义窗口小部件的所有特定类型的字段: 但是,这还不够精细。我只想更改一个字段。 问题答案: 为你的ModelAdmin创建一个自定义ModelForm并将“ w