Django 在表单中设置初始数据

Posted

技术标签:

【中文标题】Django 在表单中设置初始数据【英文标题】:Django set Initial data in Forms 【发布时间】:2018-05-06 12:19:53 【问题描述】:

我是 Django 的新手,假设我有一个类似于跟随表单的视图

class DepartmentCreateView(LoginRequiredMixin,CreateView):
    form_class = DepartmentForm
    template_name = os.path.join(TEMPLATE_FOLDER, "create/index.html")

    def get_success_url(self):
        position_id = self.kwargs.get('position_id')
        return reverse_lazy('departments_list', kwargs =  'college_id' : 
        college_id )


    def get_initial(self):
        initial = super(DepartmentCreateView, self).get_initial()
        initial.update( 'college' : self.kwargs.get('college_id'), 
        'code' : 1 )
         return initial

我的表单看起来像

class DepartmentForm(forms.ModelForm):
    class Meta:
        model = Department
        fields = ('name', 'college', 'code')

当我显示表单时,我正在使用get_initial() 为某些字段(学院)设置一些默认值,它按预期工作,但是当我提交表单时,如果表单无效(例如需要代码但值为 null ) 它在代码字段中按预期显示错误消息,但表单无法再次将默认值设置为大学。

我在这里犯了什么错误?

【问题讨论】:

我对你在这里想要什么感到有点困惑。 Web 上表单验证的正常行为是重新显示错误以及无效数据,而不是将选择重置为默认值。 我更新了我的问题,请检查。 好吧,就像我说的,你没有犯任何错误,事情就是这样运作的。如果它的工作方式不同,用户会非常困惑。 【参考方案1】:

Django 有一个方法 get_initial_for_field 用于表单,在你的情况下正确写:

def get_initial_for_field(self, field, field_name):
    """
       field_name: string = name of field in your model (college, code, name)
       field = class of this field
       return: value to initial, string, int or other (example: datetime.date.today())
    """

    if field_name == 'college':
        return self.kwargs.get('college_id')

    elif field_name == 'code':
        return '1'

【讨论】:

【参考方案2】:

您可以覆盖get_form 以将输入值设置为您的初始值

def get_form(self, form_class=None):
    form = super(CreatePost, self).get_form(form_class)
    form.fields['your_input'].widget.attrs.update('value': 'new_value')
    return form

【讨论】:

【参考方案3】:

您可以对Django Docs 中的每个字段使用initial= your_value。 这应该在您的表单中。

您可以在初始化表单时填充它的键值对,例如 initial= 'your_key', your_value

【讨论】:

以上是关于Django 在表单中设置初始数据的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Django 表单输入字段中设置事件处理程序

如何在 django 表单中设置自定义 HTML 属性?

在 django 中设置自定义用户注册表单的样式

如何在 Django 中设置 Django-Select2 小部件的初始值

如何在 Django 表单中设置密码显示/隐藏眼睛按钮

如何在 django 表单声明中设置标签的 css 类?