写这个答案,因为我在一个星期两次被咬这个错误。 来到这个问题,这是没有用的帮助我找出问题。 此代码的问题在于,您已将request.user对象传递给UserDetailsForm的init函数。并且您的init的定义不处理request.user发生的情况。
userprofile = UserProfile.objects.get(user=request.user)
if request.method == 'POST':
====>form = UserDetailsForm(request.user, request.POST, request.FILES)
if form.is_valid(): # it dies here
form.save()
return HttpResponseRedirect('/members-contact/')
查看箭头。如果您将其与您的__init__of用户详细信息表单的定义进行比较。你可以看到init不期待这个请求。用户
class UserDetailsForm(ModelForm):
class Meta:
model = UserProfile
fields = ['mobile_phone']
def __init__(self, *args, **kwargs):
self.request = kwargs.pop('request', None)
return super(UserDetailsForm, self).__init__(*args, **kwargs)
注意有一个为什么会写初始化一个对象通过正当的理由。
def __init__(self, some_object, *args, **kwargs):
super(SomeFormClass, self).__init__(self, *args, **kwargs)
self.fields['some_field'].queryset = SomeModel.objects.filter(some_field = some_object)
还要注意__init__对的ModelForm是默认的DEF已__init __(自我,* ARGS,** kwargs)
这里上面的动态表单初始化是一个很好的例子。
看来,Django是治疗变量传递在这种情况下request.user为some_field并试图呼叫被叫其中“的usermodel”没有get方法。如果你检查堆栈跟踪,你会注意到。下面的堆栈跟踪是一个模拟的例子。
Traceback (most recent call last):
File "/home/user/.local/lib/python3.5/site-packages/django/core/handlers/exception.py", line 39, in inner
response = get_response(request)
return render(request, self.template_name, context)
File "/home/user/.local/lib/python3.5/site- packages/django/shortcuts.py", line 30, in render
content = loader.render_to_string(template_name, context, request, using=using)
---
---
---
packages/django/forms/forms.py", line 297, in non_field_errors
return self.errors.get(NON_FIELD_ERRORS, self.error_class(error_class='nonfield'))
File "/home/user/.local/lib/python3.5/site-packages/django/forms/forms.py", line 161, in errors
self.full_clean()
---
---
---
self._clean_fields()
File "/home/user/.local/lib/python3.5/site-packages/django/forms/forms.py", line 382, in _clean_fields
===>value = field.widget.value_from_datadict(self.data, self.files, self.add_prefix(name))<====
File "/home/sodara/.local/lib/python3.5/site-packages/django/forms/widgets.py", line 238, in value_from_datadict
====> return data.get(name) <====
AttributeError: 'SomeObject' object has no attribute 'get'
data.get是返回值的方法调用field.widget.value_from_data_dict的结果...... 如果你注意到,在SomeObject被视为这里whoes get方法被调用的数据。
要回答这个问题,无论是定义初始化处理request.user
def __init__(self, user, *args, **kwargs):
super(YourFormClass, self).__init__(*args, **kwargs):
self.fields["some_field"].some_attr = user
或致电形式而不request.user
`form = YourFormClass(request.POST, request.FILES)`
如果你决定去与选项之一。你必须记得在调用self.fields之前调用super。因为self.fields是由super方法创建的。如果你不会遇到另一个属性错误没有字段名字段。
你为什么要将'obj.user'设置为'UserProfile'的实例? –
'UserProfile'没有'birth_date'字段? – suhailvs
我其实不知道,跳过我可以解决这个问题,通过这里。正如你从模型中看到的,我有一个'OneToOneField'给'User'对象。我试图强行设置。 –