Django AttributeError at /accounts/profile/ 'User' 对象在更新配置文件时没有属性'get'



当我试图添加表单来更新用户配置文件的描述时,我得到以下错误

My models:

class Profile(models.Model):
user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
birth_date = models.DateField(null=True, blank=True)
profile_img = models.ForeignKey(Image,on_delete=models.CASCADE,related_name='images',null=True)
description = models.TextField()

My form:

class ChangeUserDescription(ModelForm):
class Meta:
model = Profile
fields = ['description','profile_img']
widgets = {
'description': forms.Textarea(),
'profile_img':forms.ImageField()
}
labels = {
'description':'Description',
'profile_img':'Image'
}

我的观点:

@login_required
def profile(request): 
if request.method == 'POST':
form = ChangeUserDescription(request.user, request.POST)
if form.is_valid():
form.save()
else:
messages.error(request, 'Please correct the error below.')
else:
form = ChangeUserDescription(request.user)
return render(request, 'registration/profile.html', {'form': form})

和我的模板:

<div class="mainPage">
<h1>Profile</h1>

<h2>Bonjour {{user.get_username}}</h2>

<form method="post">
{% csrf_token %}
{{ form }}
<button type="submit">Save changes</button>
</form>



<a href="{% url 'adoptYourOcApp:password_change'%}" >Change password</a>

{% include "annonces/my_list.html" %}
</div>

直接当我进入相应的页面时,我得到以下错误:

AttributeError at /accounts/profile/
'User' object has no attribute 'get'
Request Method: GET
Request URL:    http://localhost:8000/accounts/profile/
Django Version: 2.2.17
Exception Type: AttributeError
Exception Value:    
'User' object has no attribute 'get'

您需要用Profile的实际实例实例化您的ModelFormChangeUserDescription,例如ChangeUserDescription(instance=profile)

some_profile = Profile.objects.get(user=request.user)
form = ChangeUserDescription(instance=some_profile)

和类似的更新:

form = ChangeUserDescription(request.POST, instance=some_profile)

问题可能在于您初始化表单的方式。您可以查看ModelForm的API参考- https://docs.djangoproject.com/en/2.2/topics/forms/modelforms/#django.forms.ModelForm

class ModelForm(BaseModelForm, metaclass=ModelFormMetaclass):
pass

它没有定义__init__方法,所以我们查找它的父__init__,即BaseModelForm.__init__

class BaseModelForm(BaseForm):
def __init__(self, data=None, files=None, auto_id='id_%s', prefix=None,
initial=None, error_class=ErrorList, label_suffix=None,
empty_permitted=False, instance=None, use_required_attribute=None,
renderer=None):

可以看到,它不接受instance作为位置参数,而是接受关键字参数。init中的第一个参数是data=None,因此您的表单实例将您传递的request.user视为数据字典,从而调用不存在的.get()

将代码修改为

form = ChangeUserDescription(request.POST, instance=request.user)

应该解决这个案子

来源:This SO问题

相关内容

最新更新