以类为基础的形式重写__init __()导致AttributeError(“ str”对象没有属性“ get”)

时间:2019-10-29 18:58:13

标签: django django-forms

我的Django应用程序中的每个

用户与 Profile 对象具有一对一的关系。我想在我的ProfileUpdateForm中做一些花哨的脆皮形式的东西。当我在ProfileUpdateForm类中覆盖 init ()时,页面会因属性错误而中断。

我最初怀疑该问题是因为我的用户在/ 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更新其个人资料。当我在ProfileUpdateForm中添加最少的 init ()代码(如下)时,它会中断。

新(中断)表格

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 (),一切都会按预期进行。我不确定为什么这会在脆皮模板中引起“非字段错误”。我尝试了许多不同的解决方法,但找不到前进的明确路径。

任何想法都可能在幕后发生吗? 感谢您阅读本文。

0 个答案:

没有答案