在Django中,我们使用modelForms将数据保存到DB。
模特课:
# myapp/models.py
from django.db import models
class MyModel(models.Model):
title = models.CharField(max_length=100)
的ModelForm:
# myapp/forms.py
from django import forms
from .models import MyModel
class MyModelForm(forms.ModelForm):
class Meta:
model = MyModel
现在,如果我想使用此ModelForm或Model类将数据从html模板中的表单保存到DB,那么我必须在html中具有与模型类中给出的相同的输入字段的名称/ ID。
<tr><th><label for="id_title">Title:</label></th>
<td><input id="id_title" name="title" maxlength="100" type="text" /></td></tr>
这不会带来安全风险吗? DB中列的名称与html中的输入字段相同?
任何人都可以看到输入字段的名称。这与DB中的列名相同。我想没有人应该知道列,表或数据库名称。
答案 0 :(得分:1)
这不会带来安全风险吗? DB中列的名称与 输入字段在html?
我想如果有人能够查询你的数据库,他就能查看其中的所有表和列名,因此隐藏表和列名称不会给出任何防御,这会给小的不便(或不会) 。
但是要避免将表名暴露给模型元中的前端定义db-table名称属性的情况:
# myapp/models.py
from django.db import models
class MyModel(models.Model):
title = models.CharField(max_length=100)
class Meta:
db_table='some_other_name'
为了隐藏列名,您可以在创建表单实例时添加prefix parameter以隐藏实际模型字段名称(表列):
MyModelForm(prefix='name_prefix')
此外,您可以在表单定义中指定前缀:
class MyModelForm(forms.ModelForm):
prefix = 'person'
class Meta:
model = MyModel
然而,这仍然只是前缀,因此要完全隐藏名称,您必须定义MyModelForm.__init__
方法并相应地更新每个field.widget.attrs['name']:
class MyModelForm(forms.ModelForm):
class Meta:
model = MyModel
fields = ['field_a',]
def __init__(self, *args, **kwargs):
super(MyModelForm, self).__init__(*args, **kwargs)
self.fields['field_a'].widget.attrs['name'] = 'custom_name'
答案 1 :(得分:0)
我找到了另一种解决方案,可以在数据库和字段名称中为列保留不同的名称 db_column。
$scope.removeRow = function (index) {
if (index === -1) {
alert("Something gone wrong");
}else{
$scope.budgetdetails.splice(index,1);
}
这样,&#39; name&#39;将在代码中的任何地方使用,但在表格列名称中将是&#39; myname&#39;。