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

在Django表单中,如何将字段设置为只读(或禁用)以便无法对其进行编辑?

靳高明
2023-03-14
问题内容

在Django表单中,如何将字段设为只读(或禁用)?

使用表单创建新条目时,应启用所有字段-但是,当记录处于更新模式时,某些字段必须是只读的。

例如,当创建一个新Item模型时,所有字段都必须是可编辑的,但是在更新记录时,是否有一种方法可以禁用该sku字段以使其可见但不能被编辑?

class Item(models.Model):
    sku = models.CharField(max_length=50)
    description = models.CharField(max_length=200)
    added_by = models.ForeignKey(User)


class ItemForm(ModelForm):
    class Meta:
        model = Item
        exclude = ('added_by')

def new_item_view(request):
    if request.method == 'POST':
        form = ItemForm(request.POST)
        # Validate and save
    else:
            form = ItemForm()
    # Render the view

可以ItemForm重用类吗?ItemFormItem模型类需要进行哪些更改?我需要编写另一个类“ ItemUpdateForm”来更新项目吗?

def update_item_view(request):
    if request.method == 'POST':
        form = ItemUpdateForm(request.POST)
        # Validate and save
    else:
        form = ItemUpdateForm()

问题答案:

如该答案所指出,Django 1.9添加了Field.disabled属性:

禁用的布尔参数设置为True时,将使用禁用的HTML属性禁用表单字段,以使用户无法对其进行编辑。即使用户篡改了提交给服务器的字段的值,也将忽略该字段,而使用表单的初始数据中的值。

使用Django 1.8及更早版本,要禁用小部件上的输入并防止恶意POST黑客入侵,除了readonly在form字段上设置属性外,还必须清除输入内容:

class ItemForm(ModelForm):
    def __init__(self, *args, **kwargs):
        super(ItemForm, self).__init__(*args, **kwargs)
        instance = getattr(self, 'instance', None)
        if instance and instance.pk:
            self.fields['sku'].widget.attrs['readonly'] = True

    def clean_sku(self):
        instance = getattr(self, 'instance', None)
        if instance and instance.pk:
            return instance.sku
        else:
            return self.cleaned_data['sku']

或者,if instance and instance.pk用另一个条件替换你正在编辑的条件。你也可以disabled在输入字段中设置属性,而不是readonly

clean_sku函数将确保该readonly值不会被覆盖POST。

否则,没有内置的Django表单字段会在拒绝绑定的输入数据时呈现值。如果这是你想要的,则应该创建一个单独ModelForm的字段,该字段将不可编辑的字段排除在外,然后将它们打印在模板中。



 类似资料:
  • 问题内容: 我试图使所有字段为只读,而不明确列出它们。 就像是: 目前尚未设置问题。 问题答案: 小心,不一定与CustomAdmin具有相同的字段! “管理员的所有字段”看起来像这样:

  • 问题内容: 我的表中有一行我不想更改(曾经)。 是否可以将MySQL行设置为READ-ONLY,以便不能以任何方式更新它?如果是这样,怎么办? 如果不是,是否可以在该行的某一列中设置一个永久值,以使其无法更改?如果是这样,怎么办? 谢谢。 问题答案: 这可能是业务逻辑,可能不属于您的数据存储层。但是,仍然可以使用触发器来实现。 如果将要更新“锁定”记录,则可以创建引发错误的触发器;由于 在执行 该

  • 问题内容: 我正在以编程方式用值更新表单上的某些字段,并且我想将字段状态设置为。做类似的事情: 似乎不起作用。 我可以使用一种方法来重置字段的状态,但是没有一种方法? 那么如何去做呢? 我看到了这篇文章https://groups.google.com/forum/#!topic/angular/NQKGAFlsln4,但我似乎找不到该方法。我正在使用Angular 1.1.5版本。 问题答案:

  • Django 1.6 我在Django表单类中有一个工作代码块,如下所示。我用来构建表单字段列表的数据集可以包含任何字段的初始值,而我在表单中设置该初始值时没有成功。块,下面的块确实填充了初始表单字典属性,但未显示初始值。请注意(如果您想知道) 属性在 调用之前不存在。 这能做到吗? 如果是这样的话,我在做什么不正确的事情? 谢啦!

  • 问题内容: 我知道通过应用boolean属性将输入元素设为只读,并且该属性不受CSS的影响。 另一方面,我的情况似乎非常适合CSS,因此我希望可以使用某种CSS技巧来实现。我的表格上有 可打印的版本 超链接。单击它会显示文档的可打印版本。它主要是CSS东西,我的print.css看起来像这样: 还有一些javascript片段,例如: 将类添加到html元素 显示没有滚动条的表 其他一些小事情,例

  • 问题内容: 用户声明: 模式声明: UserPatternDeclaration: 请求数据库: 我得到以下异常: 请帮助解决此问题。 错误消息看起来非常非常奇怪。 我已阅读相关主题的点击,但未找到答案。 ps hibernate日志(异常之前): 在浏览器中,我看到以下消息: 问题答案: 如果将HQL查询更改为会怎样? 我认为Hibernate混淆了对象和ID字段。