【问题标题】:Django UpdateView disable some fieldsDjango UpdateView 禁用某些字段
【发布时间】:2016-06-22 06:10:02
【问题描述】:

我已经创建了一个继承 UpdateView 的类视图。我已经指定了应该构建表单的字段和模型。现在说如果我有一个字段电子邮件,那么我想在表单中禁用它。我不知道如何做到这一点。

class UserUpdate(UpdateView):
    model = Users
    fields = ['email', 'first_name', 'last_name', 'birth_date']
    template_name = 'users_update_form.html'
    success_url = '/index/'

【问题讨论】:

  • 您想从表单中隐藏它吗?还是将其显示为只读字段
  • 只读字段

标签: django django-forms django-views


【解决方案1】:

隐藏它:

class UserUpdate(UpdateView):
    model = Users
    fields = ['first_name', 'last_name', 'birth_date']
    template_name = 'users_update_form.html'

在这种情况下,无需创建单独的 Form 类 - 因为这是由 UpdateView 处理的。

使字段只读

class UserForm(forms.ModelForm):
    class Meta:
        model = Users
        fields = ['email', 'first_name', 'last_name', 'birth_date']
    email = forms.CharField(widget=forms.TextInput(attrs={'readonly':'readonly'}))

def clean_email(self):
    return self.initial['email']


class UserUpdate(UpdateView):
    model = Users
    form_class = UserForm

Django 1.9 注释

Django 1.9 内置了一个disabled 选项。使用它可以跳过额外的clean 方法。

class UserForm(forms.ModelForm):
    class Meta:
        model = Users
        fields = ['email', 'first_name', 'last_name', 'birth_date']
    email = forms.CharField(disabled=True)

【讨论】:

  • 谢谢.. 早些时候我尝试在 Meta 类中使用小部件并将 attrs 指定为禁用为 True。那没有用。任何想法为什么?
  • 不要忘记clean_email 方法。否则该字段将是只读的,但仍然可以在请求中篡改它。
  • 在表单或视图的Meta 类中?
  • Meta 的表单中它也应该可以工作:widgets = {'email': forms.TextInput(attrs={'readonly':'readonly'})}
  • 是的,它在那里工作。拼写错误写成'widget'。我的错。有时太多的 django 会迫使你犯这样的错误。大声笑
【解决方案2】:

使用您不想在表单中显示的排除字段定义用户表单

class UserForm(forms.ModelForm):
    class Meta:
        model = Users
        exclude = ('email',) # add fields to disable it in the form

如果你想在 > django 1.9 中将字段设为只读 使用disabled

class UserForm(forms.ModelForm):
    email =  forms.CharField(disabled=True)
    class Meta:
        model = Users
        fields = ['email', 'first_name', 'last_name', 'birth_date']

然后在视图中指定表单。

class UserUpdate(UpdateView):
    model = Users
    form_class = UserForm
    ....

【讨论】:

    猜你喜欢
    • 2013-08-28
    • 2020-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-27
    • 1970-01-01
    • 2017-09-15
    • 1970-01-01
    相关资源
    最近更新 更多