Переопределение __init __ () в форме на основе классов вызывает AttributeError (объект 'str' не имеет атрибута 'get') - PullRequest
0 голосов
/ 29 октября 2019

Каждый Пользователь в моем приложении Django имеет отношение 1 к 1 с объектом Profile . Я хочу сделать некоторые изящные элементы отображения хрустящих форм в моем ProfileUpdateForm. Когда я переопределяю init () в своем классе ProfileUpdateForm, страница разрывается с ошибкой атрибута.

Я изначально подозревал, что проблема заключается в том, что мои пользователи изменяют свой профиль в / u / update снет в строке URL. Поэтому, возможно, форма не получает существующий экземпляр Profile . В трассировке я вижу ожидаемый профиль, так что, возможно, это не проблема.

В моем представлении на основе классов я установил get_object () для возврата self.request.user.profile , так что любой пользователь, посещающий u / update, сможет обновлять только свой собственный профиль, а не другие. Это работает нормально, но как только я пытаюсь переопределить init () в моей форме на основе классов, форма обновления перестает работать.

Вот что у нас есть:

Форма

class ProfileUpdateForm(forms.ModelForm):
    class Meta:
        model = Profile
        fields = ('tagline', 'summary_text_public', 'summary_text_contacts')

Просмотр

class ProfileUpdate(LoginRequiredMixin, generic.UpdateView):
    form_class = ProfileUpdateForm
    template_name = 'profile/update.html'
    success_url = reverse_lazy('profile:redirect_to_self')

    def get_object(self):
        return self.request.user.profile

Шаблон URL

path('update/', views.ProfileUpdate.as_view(), name='update'),

Приведенный выше код работает, как и ожидалось, пользователи могут обновлять свои профили в u / update. Когда я добавляю минимальный код init () (ниже) в ProfileUpdateForm, он прерывается.

Новая (ломающаяся) форма

class ProfileUpdateForm(forms.ModelForm):

    def __init__(self, *args, **kwargs):
        super(ProfileUpdateForm, self).__init__(*args, *kwargs)

    class Meta:
        model = Profile
        fields = ('tagline', 'summary_text_public', 'summary_text_contacts')

Переопределение init (), как показано выше, приводит к ошибке AttributeError: у объекта 'str' нет атрибута 'get'

Дополнительная информация:

Error during template rendering
In template /home/<user>/.local/share/virtualenvs/<application env>/lib/python3.6/site-packages/crispy_forms/templates/bootstrap4/errors.html, error at line 1

'str' object has no attribute 'get'
1   {% if form.non_field_errors %}
2       <div class="alert alert-block alert-danger">
3           {% if form_error_title %}<h4 class="alert-heading">{{ form_error_title }}</h4>{% endif %}
4           <ul>
5               {{ form.non_field_errors|unordered_list }}
6           </ul>
7       </div>
8   {% endif %}

Я не уверен, почему это происходит. Если я не переопределю init (), все будет работать как положено. Я не уверен, почему это вызывает «неполевую ошибку» в хрустящих шаблонах. Я пробовал немало разных обходных путей и не могу найти четкого пути вперед.

Есть идеи, что может происходить за кулисами? Спасибо, что прочитали это далеко.

...