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

Django如何知道呈现表单字段的顺序?

强阳曜
2023-03-14
问题内容

如果我有Django表单,例如:

class ContactForm(forms.Form):
    subject = forms.CharField(max_length=100)
    message = forms.CharField()
    sender = forms.EmailField()

我调用了这种形式的实例的as_table()方法,Django将按照上述指定的顺序渲染字段。

我的问题是Django如何知道类变量的定义顺序?

(例如,当我想从类的init方法中添加字段时,如何覆盖此顺序?)


问题答案:

我继续回答了自己的问题。这是供将来参考的答案:

Django form.py中,使用该__new__方法将类变量最终self.fields按类中定义的顺序加载到其中,这确实有些不可思议。 self.fieldsDjango SortedDict实例(在中定义datastructures.py)。

因此,要覆盖此内容,请在我的示例中说,你希望发送者优先,但需要在init方法中添加它,你可以这样做:

class ContactForm(forms.Form):
    subject = forms.CharField(max_length=100)
    message = forms.CharField()
    def __init__(self,*args,**kwargs):
        forms.Form.__init__(self,*args,**kwargs)
        #first argument, index is the position of the field you want it to come before
        self.fields.insert(0,'sender',forms.EmailField(initial=str(time.time())))


 类似资料:
  • 我的表格代码: 我的视图代码: 堆栈跟踪: 环境: 请求方法:获取请求URL: Django版本:1.4 Python版本:2.7。2个已安装的应用程序:('django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.sites','django.contrib.messa

  • 问题内容: 有什么巧妙的方法可以使django表单在必填字段之后用星号呈现字段?还是提供其他一些巧妙的方法来标记必填字段?如果我已经按照表单中的要求设置了字段,则我不想在模板中再次执行此操作。 问题答案: 有什么巧妙的方法可以使django表单在必填字段之后用星号呈现字段?还是提供其他一些巧妙的方法来标记必填字段?如果我已经按照表单中的要求设置了字段,则我不想在模板中再次执行此操作。从Django

  • 假设我有以下模型: 我用custom clean()创建了一个自定义ModelForm,它正在像一个魅力一样工作(根据unittests和手动测试): 所以,因为我的根文件夹只是一个普通的FKs为空的Folder-object,所以我甚至不想在创建时向用户显示这些字段。我为此创建了另一个表单: 正如您所看到的,我也排除了用户,这个值将在视图中设置。当前,这是我的视图代码: 这整个设置是有效的,但似

  • 问题内容: 与ListView不同,我们可以更新this.state.datasource。是否有任何方法或示例更新FlatList或重新呈现它? 我的目标是在用户按下按钮时更新文本值。 问题答案: 使用FlatList组件上的属性。 如文档所述: 通过传递给我们,确保更改时将重新呈现自己。如果不设置此道具,就不会知道它需要重新渲染任何项目,因为它也是a ,并且道具比较不会显示任何更改。

  • 问题内容: 我有一个带有电子邮件属性的表单。 当使用某些验证错误时,Django仍会在输入标签的value属性中呈现先前的值: 我想自己渲染输入标签(在发生错误的情况下添加一些JavaScript代码和错误类)。例如,这是我的模板,而不是{{ form.email }}: 但是,这不会向用户显示错误的值(在此示例中)。 如何在模板中获取字段的值? 问题答案: 这是一项功能请求,已在Django 1

  • 问题内容: 我有这个模特 我希望用户在两个字段中都不能使用字母数字以外的任何其他字符。 有什么办法吗? 问题答案: 您将使用验证器来限制字段接受的内容。A可以在这里实现窍门: 请注意,已经有一个验证器可以为您验证电子邮件地址。上述验证器将不允许使用有效的电子邮件地址。