在 Django 中禁用所有表单字段的语法

Posted

技术标签:

【中文标题】在 Django 中禁用所有表单字段的语法【英文标题】:Syntax for Disabling all form fields in Django 【发布时间】:2019-04-04 00:06:48 【问题描述】:

我正在尝试在项目中显示用户的个人资料。我想呈现一个表单,但使其禁用/无法更改(仅显示)。我无法弄清楚它的语法。帮助将不胜感激!

这是 view.py:

@login_required
def profile(request):
    user_form = UserForm(instance=request.user)
    user_form.fields.disabled = True <------- HELP HERE
    return render(request, 'rentadevapp/profile.html', 'user_form': user_form)

我本质上只想显示一个只读/禁用的表单。然后,用户有一个编辑按钮,可将他们带到个人资料编辑页面。

感谢您的帮助!

这是html以防万一:

 <form method="GET" action="/profile_edit">% csrf_token %
                 user_form|crispy 
                <button type="submit" class="edit btn btn-default btn-block btn-lg">Edit</button><br>
            </form>

Forms.py

class UserForm(forms.ModelForm):

    password = forms.CharField(label='Password', widget=forms.PasswordInput)
    password2 = forms.CharField(label='Repeat password', widget=forms.PasswordInput)

    class Meta:
        model = User
        fields = ('username', 'first_name', 'last_name', 'email')

【问题讨论】:

UserForm是自己定义的自定义表单吗? @lmiuelvargasf ,是的。查看更新的文本 您需要根据您在页面上单击的按钮来启用/禁用,还是在渲染后重新启用/禁用? @lmiguelvargasf ,我只需要禁用它的页面 【参考方案1】:

因为您似乎使用的是 django-crispy-forms,所以我会使用以下内容:

class UserForm(forms.ModelForm):

    password = forms.CharField(label='Password', widget=forms.PasswordInput)
    password2 = forms.CharField(label='Repeat password', widget=forms.PasswordInput)

    def __init__(self,disable_fields=False, *args, **kwargs):
        super().__init__(*args, **kwargs)
        if disable_fields:
            self.fields['password'].disabled = True
            self.fields['password2'].disabled = True

    class Meta:
        model = User
        fields = ('username', 'first_name', 'last_name', 'email')

因此,当您要创建表单时,这应该可以使其工作:

@login_required
def profile(request):
    user_form = UserForm(instance=request.user, disable=True)
    return render(request, 'rentadevapp/profile.html', 'user_form': user_form)

【讨论】:

我在这里关注你,但是如何在我的特定视图中禁用它? 在创建带有禁用字段的表单对象时使用user_form = UserForm(instance=request.user, disable_fields = True) 非常感谢!我希望我的老师在这方面给了我更多的背景知识,但他只是把我们扔进去了。【参考方案2】:

Django 1.9 添加了Field.disabled 属性:https://docs.djangoproject.com/en/stable/ref/forms/fields/#disabled

disabled 布尔参数,当设置为 True 时,使用 disabled HTML 属性禁用表单字段,这样用户就无法编辑它。即使用户篡改了提交给服务器的字段值,它也会被忽略,取而代之的是表单初始数据中的值。

您可以这样做以禁用视图中所需的字段:

@login_required
def profile(request):
    user_form = UserForm(instance=request.user)
    for fieldname in user_form.fields:
        user_form.fields[fieldname].disabled = True
    return render(request, 'rentadevapp/profile.html', 'user_form': user_form)

【讨论】:

我将如何处理所有字段? 也许使用 for 循环 我不知道你是否打算这样做,但是第一段与this答案相同。

以上是关于在 Django 中禁用所有表单字段的语法的主要内容,如果未能解决你的问题,请参考以下文章

python Django:在表单中传递一个禁用选择字段的值

Django - 禁用表单集中现有表单的编辑,但允许在新表单中编辑

在Django中的文本字段上禁用自动完成?

Django - 禁用表单选择字段验证

如何使用 django 表单/模型来表示字段之间的选择?

Django 表单中的只读字段