【问题标题】:Django AttributeError at /accounts/profile/ 'User' object has no attribute 'get' while update profile/accounts/profile/'User'对象的Django AttributeError在更新配置文件时没有属性'get'
【发布时间】:2021-01-29 12:40:08
【问题描述】:

您好,当我尝试添加表单以更新用户个人资料的描述时出现以下错误

我的模型:

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()

我的表格:

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'

【问题讨论】:

  • 在 django 中,默认的查询集操作是从对象管理器开始的,所以内部的表单应该调用 User.objects.get() 而不是 User.get()。请看一下您的代码库,也许某处有重新定义的表单类。您是否使用任何其他软件包?

标签: python django django-models django-forms


【解决方案1】:

您需要使用Profile 的实际实例来实例化您的ModelForm ChangeUserDescription,例如ChangeUserDescription(instance=profile).

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

更新时类似:

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

【讨论】:

    【解决方案2】:

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

    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 question

    【讨论】:

      猜你喜欢
      • 2021-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-04
      • 2019-09-07
      • 2020-04-01
      • 2020-11-07
      • 2021-07-04
      相关资源
      最近更新 更多