Django 保存用户时出现错误,找不到基于选项的角色。

huangapple go评论88阅读模式
英文:

Django save User error not finding role based on choices

问题

我有这个用于用户的models.py文件:

  1. from django.contrib.auth.models import AbstractUser
  2. from django.db.models import CharField
  3. from django.urls import reverse
  4. from django.utils.translation import gettext_lazy as _
  5. from django.db import models
  6. from django.db.utils import IntegrityError
  7. class Role(models.Model): # 如果要更改角色,请参考上面的注释
  8. ADMIN = 'ADMIN'
  9. SELLER = 'SELLER'
  10. SALES_DIRECTOR = 'SALES_DIRECTOR'
  11. SALES_ASSISTANT = 'SALES_ASSISTANT'
  12. OPERATIONS = 'OPERATIONS'
  13. ROLE_CHOICES = [
  14. (ADMIN, 'Administrator'),
  15. (SELLER, 'Seller'),
  16. (SALES_DIRECTOR, 'Sales Director'),
  17. (SALES_ASSISTANT, 'Sales Assistant'),
  18. (OPERATIONS, 'Operations'),
  19. ]
  20. role = models.CharField(
  21. max_length=20,
  22. choices=ROLE_CHOICES,
  23. default=SELLER,
  24. )
  25. def __str__(self): # 这里
  26. return self.role
  27. class User(AbstractUser):
  28. # Orphea的默认自定义用户模型
  29. # 如果需要在用户注册时填写字段,请相应地检查forms.SignupForm和forms.SocialSignupForms。
  30. # 名字不涵盖全球范围内的名称模式
  31. name = CharField(_('用户名称'), blank=True, max_length=255)
  32. first_name = None # 类型:忽略
  33. last_name = None # 类型:忽略
  34. role = models.ForeignKey(Role, on_delete=models.SET_NULL, null=True)
  35. def get_absolute_url(self):
  36. # 获取用户详细视图的URL
  37. return reverse("users:detail", kwargs={"username": self.username})
  38. @property
  39. def role_choices(self):
  40. return [(role.id, role.role) for role in Role.objects.all()]
  41. def save(self, *args, **kwargs):
  42. # 检查是否存在所选角色的角色实例
  43. role, created = Role.objects.get_or_create(role=self.role)
  44. # 将角色实例分配给用户
  45. self.role = role
  46. super().save(*args, **kwargs)

我的角色表包含:

  1. pk, role
  2. 6, ADMIN
  3. 7, SELLER
  4. 8, SALES_DIRECTOR
  5. 9, SALES_ASSISTANT
  6. 10, OPERATIONS

当尝试保存用户时,我遇到以下错误:

  1. 在/admin/users/user/1/change/处的ValueError
  2. 无法分配'ADMIN''User.role'必须是“Role”实例。
  3. 我不知道该如何修复它。
  4. 目标是维护角色选择并检查角色是否存在于列表中,然后更新分配了角色的用户。每个用户只有一个角色。
英文:

I've this models.py for user:

  1. from django.contrib.auth.models import AbstractUser
  2. from django.db.models import CharField
  3. from django.urls import reverse
  4. from django.utils.translation import gettext_lazy as _
  5. from django.db import models
  6. from django.db.utils import IntegrityError
  7. """
  8. Pour toute modification des roles possibles, il faut lancer dans le terminal
  9. python3 manage.py create_roles
  10. Pour voir le code correspondant, il faut aller dans le repertoire management/commands/
  11. C est une commande cree expres pour cette fonctionnalité
  12. """
  13. class Role(models.Model): # si changement de roles voir ci dessus le commentaire
  14. ADMIN = 'ADMIN'
  15. SELLER = 'SELLER'
  16. SALES_DIRECTOR = 'SALES_DIRECTOR'
  17. SALES_ASSISTANT = 'SALES_ASSISTANT'
  18. OPERATIONS = 'OPERATIONS'
  19. ROLE_CHOICES = [
  20. (ADMIN, 'Administrator'),
  21. (SELLER, 'Seller'),
  22. (SALES_DIRECTOR, 'Sales Director'),
  23. (SALES_ASSISTANT, 'Sales Assistant'),
  24. (OPERATIONS, 'Operations'),
  25. ]
  26. role = models.CharField(
  27. max_length=20,
  28. choices=ROLE_CHOICES,
  29. default=SELLER,
  30. )
  31. def __str__(self): # Here
  32. return self.role
  33. class User(AbstractUser):
  34. """
  35. Default custom user model for Orphea.
  36. If adding fields that need to be filled at user signup,
  37. check forms.SignupForm and forms.SocialSignupForms accordingly.
  38. """
  39. #: First and last name do not cover name patterns around the globe
  40. name = CharField(_("Name of User"), blank=True, max_length=255)
  41. first_name = None # type: ignore
  42. last_name = None # type: ignore
  43. role = models.ForeignKey(Role, on_delete=models.SET_NULL, null=True)
  44. def get_absolute_url(self):
  45. """Get url for user's detail view.
  46. Returns:
  47. str: URL for user detail.
  48. """
  49. return reverse("users:detail", kwargs={"username": self.username})
  50. @property
  51. def role_choices(self):
  52. return [(role.id, role.role) for role in Role.objects.all()]
  53. def save(self, *args, **kwargs):
  54. # Check if role instance exists for selected role
  55. role, created = Role.objects.get_or_create(role=self.role)
  56. # Assign the role instance to the user
  57. self.role = role
  58. super().save(*args, **kwargs)

My role table contains :

  1. pk, role :
  2. 6,ADMIN
  3. 7,SELLER
  4. 8,SALES_DIRECTOR
  5. 9,SALES_ASSISTANT
  6. 10,OPERATIONS

I've this error when trying to save a user :
ValueError at /admin/users/user/1/change/
Cannot assign "'ADMIN'": "User.role" must be a "Role" instance.

I don't know how to fix it.

Objectif is to maintain role choices and to check if role exists in list and then update user with role assigned. each user have only one role.

答案1

得分: 0

问题出在我的admin.py文件中:我在ChoiceField中放置了角色,但它与角色对象不匹配。

  1. class UserAdminForm(forms.ModelForm):
  2. # role = forms.ChoiceField(choices=Role.ROLE_CHOICES)
  3. role = Role.objects.all()
  4. class Meta:
  5. model = get_user_model()
  6. fields = '__all__'
英文:

The issue was in my admin.py: I put role from choiceField but it doesn't t not fit with a role object.

  1. class UserAdminForm(forms.ModelForm):
  2. #role = forms.ChoiceField(choices=Role.ROLE_CHOICES)
  3. role = Role.objects.all()
  4. class Meta:
  5. model = get_user_model()
  6. fields = '__all__'

huangapple
  • 本文由 发表于 2023年2月27日 06:45:03
  • 转载请务必保留本文链接:https://go.coder-hub.com/75575444.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定