用小部件覆盖 ModelForm
Overriding ModelForm with widgets
用户有一个可以保存敏感数据的表单。我能够加密这些数据并使用模型将其存储在数据库中。但是,如果用户想要修改此数据,它会出现在表单的 TextInput 中。
我读过 this post, and this one。答案似乎就在那里,但我无法成功实施。这是我拥有的:
型号
class CustomUser(AbstractUser):
api_key = models.CharField(max_length=256, default='null')
表格
class APIForm(forms.ModelForm):
class Meta:
model = CustomUser
fields = ('api_key')
widgets = {
'api_key': TextInput(attrs={'size': 10, 'placeholder': 'Your key'}),
}
Html
<form method="post">
{% csrf_token %}
{{ form|crispy }}
<button type="submit">Save changes</button>
</form>
似乎表单没有检测到小部件,因为如果我更改属性大小的值,表单将不会更改。
我是不是漏掉了什么?
提前致谢
更新。
这是我简化的视图代码:
观看次数
class KeyView(LoginRequiredMixin, UpdateView):
model = CustomUser
form_class = APIForm
template_name = 'account/api_form.html'
success_url = reverse_lazy('pages:home')
def get_object(self):
return self.request.user
def form_valid(self, form):
self.object = form.save(commit=False)
key=botcrypt.encrypt_val(self.object.api_key)
self.object.api_key =key.decode("utf-8")
self.object.save()
messages.success(self.request, 'key updated with success!')
return super().form_valid(form)
我正在为帐户使用 allauth,以防此信息很重要
您可以尝试替代上述方法
api_key = forms.CharField(_(u'API Key'), required=False)
api_key.widget = forms.TextInput(attrs={'size': 10, 'title': 'API Key',})
或
api_key = forms.CharField(
_(u'API Key'),
required=False,
widget=forms.TextInput(attrs={'size': 10, 'title': 'API Key',})
)
正如预期的那样,实际上解决方案非常简单....
Models
、Forms
和 html
中的所有代码都是正确的。
我只需要从 views
中清空 get_object
中的键值:
def get_object(self):
self.request.user.api_key = ""
return self.request.user
用户有一个可以保存敏感数据的表单。我能够加密这些数据并使用模型将其存储在数据库中。但是,如果用户想要修改此数据,它会出现在表单的 TextInput 中。
我读过 this post, and this one。答案似乎就在那里,但我无法成功实施。这是我拥有的:
型号
class CustomUser(AbstractUser):
api_key = models.CharField(max_length=256, default='null')
表格
class APIForm(forms.ModelForm):
class Meta:
model = CustomUser
fields = ('api_key')
widgets = {
'api_key': TextInput(attrs={'size': 10, 'placeholder': 'Your key'}),
}
Html
<form method="post">
{% csrf_token %}
{{ form|crispy }}
<button type="submit">Save changes</button>
</form>
似乎表单没有检测到小部件,因为如果我更改属性大小的值,表单将不会更改。
我是不是漏掉了什么?
提前致谢
更新。
这是我简化的视图代码:
观看次数
class KeyView(LoginRequiredMixin, UpdateView):
model = CustomUser
form_class = APIForm
template_name = 'account/api_form.html'
success_url = reverse_lazy('pages:home')
def get_object(self):
return self.request.user
def form_valid(self, form):
self.object = form.save(commit=False)
key=botcrypt.encrypt_val(self.object.api_key)
self.object.api_key =key.decode("utf-8")
self.object.save()
messages.success(self.request, 'key updated with success!')
return super().form_valid(form)
我正在为帐户使用 allauth,以防此信息很重要
您可以尝试替代上述方法
api_key = forms.CharField(_(u'API Key'), required=False)
api_key.widget = forms.TextInput(attrs={'size': 10, 'title': 'API Key',})
或
api_key = forms.CharField(
_(u'API Key'),
required=False,
widget=forms.TextInput(attrs={'size': 10, 'title': 'API Key',})
)
正如预期的那样,实际上解决方案非常简单....
Models
、Forms
和 html
中的所有代码都是正确的。
我只需要从 views
中清空 get_object
中的键值:
def get_object(self):
self.request.user.api_key = ""
return self.request.user