Переопределение ModelForm с помощью виджетов

У пользователя есть форма, в которой он может сохранять конфиденциальные данные. Я могу шифровать эти данные и хранить их в базе данных с помощью моделей. Однако, если пользователь хочет изменить эти данные, они появляются в TextInput из формы.

Я прочитал этот пост и этот. Ответ, кажется, есть, но мне не удается добиться успеха в реализации. Вот что у меня есть:

Модели

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>

Похоже, что форма не определяет виджет, так как если я изменю значение атрибута size, форма не изменится.

Я что-то упускаю?

заранее спасибо

ОБНОВИТЬ.

Вот мой упрощенный код представления:

Просмотры

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 для учетных записей, если эта информация важна


person Alvaro    schedule 01.04.2019    source источник
comment
можешь опубликовать код просмотра   -  person rahul.m    schedule 01.04.2019
comment
Это здесь! Я должен что-то упустить, но я не знаю, что...   -  person Alvaro    schedule 01.04.2019


Ответы (2)


Вы можете попробовать альтернативу для вышеуказанного метода

api_key = forms.CharField(_(u'API Key'), required=False)
api_key.widget = forms.TextInput(attrs={'size': 10, 'title': 'API Key',})

or

api_key = forms.CharField(
    _(u'API Key'),
    required=False,
    widget=forms.TextInput(attrs={'size': 10, 'title': 'API Key',})
)
person rahul.m    schedule 01.04.2019

Так что на самом деле решение было довольно простым, как и ожидалось....

Весь код из Models, Forms и html был правильным.

Мне нужно было только очистить значение ключа в get_object от views:

def get_object(self):
    self.request.user.api_key = ""
    return self.request.user
person Alvaro    schedule 03.04.2019