用小部件覆盖ModelForm

问题描述 投票:0回答:2

用户具有可以保存敏感数据的表单。我能够加密这些数据并使用模型将其存储在数据库中。但是,如果用户想要修改此数据,它将显示在表单的TextInput中。

我读过this postthis 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>

似乎表单没有检测到窗口小部件,因为如果我更改属性大小的值,表单将不会更改。

我错过了什么吗?

提前致谢

UPDATE.

这是我的视图代码简化:

查看

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用于帐户

django django-models django-forms django-crispy-forms django-widget
2个回答
0
投票

您可以尝试替代上述方法

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',})
)

0
投票

所以实际上解决方案很简单,正如所料......

来自ModelsFormshtml的所有代码都是正确的。

我只需要从get_object清空views中的键的值:

def get_object(self):
    self.request.user.api_key = ""
    return self.request.user
© www.soinside.com 2019 - 2024. All rights reserved.