用户与 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
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 (),一切都会按预期进行。我不确定为什么这会在脆皮模板中引起“非字段错误”。我尝试了许多不同的解决方法,但找不到前进的明确路径。
任何想法都可能在幕后发生吗? 感谢您阅读本文。