【问题标题】:Django extended user model doesn't have extended attributesDjango 扩展用户模型没有扩展属性
【发布时间】:2023-03-22 08:31:01
【问题描述】:

我正在以这种方式扩展默认用户模型

models.py

from django.db import models
from django.contrib.auth.models import User

class Profile(User):
    city = models.CharField(max_length = 60)
    company = models.CharField(max_length = 100)

    def __str__(self):
        return self.username

我正在使用以下视图注册用户。

class ProfileFormView(View):
    form_class = UserForm
    template_name = 'register.html'

    # Display empty form
    def get(self, request):
        form = self.form_class(None)
        return render(request, self.template_name, {'form': form})

    # Process user data and add to DB.
    def post(self, request):
        form = self.form_class(request.POST)

        if form.is_valid():
            user = form.save(commit = False)

            # clean form data.
            username = form.cleaned_data['username']
            password = form.cleaned_data['password']
            user.city = form.cleaned_data['city']
            user.company = form.cleaned_data['company']
            user.set_password(password)
            user.save()

            # returns User object if credentials are correct
            user = authenticate(username= username, password = password)

            if user is not None:

                if user.is_active:
                    login(request, user)

                    return render(request, 'profile.html', {})

        return render(request, self.template_name, {'form': form})

如您所见,一旦在注册页面上按下提交,我就会重定向到 profile.html,我在表单操作中调用的视图函数如下

def home(request):
    all_users = Profile.objects.all()
    city = request.user.city # this line throws error
    return render(request, 'profile.html', {'city': city,'login_user': request.user, 'all_users': all_users})

Exception Value: 'User' object has no attribute 'city'

但我无法访问用户所在的城市错误在上面标记的行中抛出。我究竟做错了什么。谢谢你

【问题讨论】:

标签: python django django-views


【解决方案1】:

我认为您正在尝试访问 User.city 属性,而您应该通过 User.profile.city 进行访问。

city = request.user.city # this line throws error

替换为:

# Check if the user has a profile
if hasattr(request.user, 'profile'):
    city = request.user.profile.city
# Otherwise, city is None (Or throw an Exception)
else:
    city = None

编辑

正如@itzmeontv 所说,也替换:

# clean form data.
username = form.cleaned_data['username']
password = form.cleaned_data['password']
user.city = form.cleaned_data['city']
user.company = form.cleaned_data['company']
user.set_password(password)
user.save()

与:

# Clean user form data.
username = form.cleaned_data['username']
password = form.cleaned_data['password']
user.set_password(password)
user.save() 

# Update or create the user's profile
profile, _ = Profile.objects.get_or_create(id=user.pk)
profile.__dict__.update(user.__dict__)
profile.city = form.cleaned_data['city']
profile.company = form.cleaned_data['company']
profile.save()

确保您从表单中更新用户的个人资料数据

【讨论】:

  • 正如@itzmeontv 所说,也替换
猜你喜欢
  • 2016-10-12
  • 2011-02-28
  • 2013-12-06
  • 2018-01-21
  • 2012-12-15
  • 1970-01-01
  • 2018-04-24
相关资源
最近更新 更多