注意:如果你想通过告诉我你不喜欢django.contrib.auth来回答这个问题,请继续.这没有用.我很清楚这个问题的意见范围和力度.
现在,问题是:
惯例是使用OneToOne to User创建一个模型UserProfile.
在我能想到的各种方式中,一种更有效和更有效的方法是将User子类化为一个打算用于系统中每个人的类 - 一个名为Person(User)的类.
我没有看到为什么前者是传统的而后者被视为黑客的连贯解释.不久之前,我改用了OneToOne方法,以便获得使用get_profile()的能力,从此我就后悔了.除非我能理解这种方法的优点,否则我正在考虑转回去.
django django-models django-contrib django-authentication django-users
我的模特:
class UserProfile(models.Model):
TYPES_CHOICES = (
(0, _(u'teacher')),
(1, _(u'student')),
)
user = models.ForeignKey(User, unique=True)
type = models.SmallIntegerField(default=0, choices=TYPES_CHOICES, db_index=True)
cities = models.ManyToManyField(City)
class City(models.Model):
name = models.CharField(max_length=50)
slug = models.SlugField(max_length=50)
Run Code Online (Sandbox Code Playgroud)
在admin.py中:
admin.site.unregister(User)
class UserProfileInline(admin.StackedInline):
model = UserProfile
class UserProfileAdmin(UserAdmin):
inlines = [UserProfileInline]
admin.site.register(User, UserProfileAdmin)
@receiver(post_save, sender=User)
def create_profile(sender, instance, created, **kwargs):
"""Create a matching profile whenever a user object is created."""
if created:
profile, new = UserProfile.objects.get_or_create(user=instance)
Run Code Online (Sandbox Code Playgroud)
但是当我添加新用户并选择一个城市时,我得到了这个错误:/ admin/auth/user/add /中的IntegrityError(1062,"密钥'user_id'的重复条目'3'")
我的代码出了什么问题?如果我没有选择任何城市 - 用户被正确添加.某种程度上,用户被多次添加到UserProfile.
我正在写一个django项目.并且想知道用户删除自己的帐户后,有没有办法django内置自动删除与该用户相关的所有对象(例如一些通用的foreign_key)?或者我应该使用信号"post_delete"来删除每个相关的对象?
在Admin界面中创建用户时,我需要将is_staff值设置为True.
我怎样才能做到这一点?
谢谢
我正在试图找出如何从中排除用户名和/或密码的方法UserChangeForm.我试过了两个exclude,fields但我不适用于这两个领域.
这是一些代码:
class ArtistForm(ModelForm):
class Meta:
model = Artist
exclude = ('user',)
class UserForm(UserChangeForm):
class Meta:
model = User
fields = (
'first_name',
'last_name',
'email',
)
exclude = ('username','password',)
def __init__(self, *args, **kwargs):
self.helper = FormHelper
self.helper.form_tag = False
super(UserForm, self).__init__(*args, **kwargs)
artist_kwargs = kwargs.copy()
if kwargs.has_key('instance'):
self.artist = kwargs['instance'].artist
artist_kwargs['instance'] = self.artist
self.artist_form = ArtistForm(*args, **artist_kwargs)
self.fields.update(self.artist_form.fields)
self.initial.update(self.artist_form.initial)
def clean(self):
cleaned_data = super(UserForm, self).clean()
self.errors.update(self.artist_form.errors)
return cleaned_data
def save(self, commit=True):
self.artist_form.save(commit)
return super(UserForm, …Run Code Online (Sandbox Code Playgroud) 我试图在Django 1.6中实现我自己的自定义用户模型,但我收到此错误.
Traceback (most recent call last):
File "./manage.py", line 10, in <module>
execute_from_command_line(sys.argv)
File "/Users/gabriel/.virtualenvs/hang_server/lib/python3.4/site-packages/django/core/management/__init__.py", line 399, in execute_from_command_line
utility.execute()
File "/Users/gabriel/.virtualenvs/hang_server/lib/python3.4/site-packages/django/core/management/__init__.py", line 392, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/Users/gabriel/.virtualenvs/hang_server/lib/python3.4/site-packages/django/core/management/base.py", line 242, in run_from_argv
self.execute(*args, **options.__dict__)
File "/Users/gabriel/.virtualenvs/hang_server/lib/python3.4/site-packages/django/core/management/base.py", line 285, in execute
output = self.handle(*args, **options)
File "/Users/gabriel/.virtualenvs/hang_server/lib/python3.4/site-packages/django/contrib/auth/management/commands/createsuperuser.py", line 141, in handle
self.UserModel._default_manager.db_manager(database).create_superuser(**user_data)
TypeError: create_superuser() missing 1 required positional argument: 'email'
Run Code Online (Sandbox Code Playgroud)
这是我的UserManager
class UserManager(BaseUserManager):
def _create_user(self, username, email, password, is_staff, is_superuser, **extra_fields):
now = timezone.now()
email = self.normalize_email(email)
user = …Run Code Online (Sandbox Code Playgroud) 我需要为Django的User模型添加更多字段,因此我创建了一个自定义模型类(在名为accounts的应用程序中名为Accounts),它扩展了Django的AbstractUser类.
之后,我更新了我的settings.py文件,定义了AUTH_USER_MODEL属性:
AUTH_USER_MODEL = 'accounts.Accounts'
Run Code Online (Sandbox Code Playgroud)
然后,我使用该python manage.py makemigrations命令为自定义模型创建了一个迁移文件.
之后,我运行python manage.py migrate命令,我收到此错误消息:
ValueError: The field admin.LogEntry.user was declared with a lazy reference to 'accounts.accounts', but app 'accounts' isn't installed.
Run Code Online (Sandbox Code Playgroud)
错误的原因是什么?我该如何解决?
更新:现在,如果我运行该python manage.py makemigrations命令,我收到此错误消息:
ValueError: The field admin.LogEntry.user was declared with a lazy reference to 'accounts.accounts', but app 'accounts' doesn't provide model 'accounts'.
Run Code Online (Sandbox Code Playgroud) 我有一个EuropartsBuyer名为的组和模型Product.
以下代码向Product模型添加权限.
class Meta:
permissions = (
("can_add_cost_price", "Can add cost price"),
)
Run Code Online (Sandbox Code Playgroud)
在我的一个视图中,我有以下代码将此权限添加到该组.
europarts_buyer, created = Group.objects.get_or_create(name='EuropartsBuyer')
add_cost_price = Permission.objects.get(codename='can_add_cost_price')
europarts_buyer.permissions.add(add_cost_price)
Run Code Online (Sandbox Code Playgroud)
在Django Admin的帮助下,我已经向该组添加了一个用户EuropartsBuyer.
当我在另一个视图中使用以下代码时
if request.user.has_perm('can_add_cost_price'):
do something
Run Code Online (Sandbox Code Playgroud)
结果应该是,True但它显示False.因此,if子句下的代码不会运行.
我已经在Django shell中导入了当前登录的用户,当我再次测试权限时,它显示为False.
我在这做错了什么?
我在ListView页面上列出注册用户,并尝试显示用户是否是超级用户。
我的主用户是使用python manage.py createsuperuser命令创建的,我确信它是超级用户,因为我也从管理面板检查过。
当我尝试打印它是否是超级用户时,我的代码总是显示输出False。这是我的代码:
视图.py
@method_decorator(staff_member_required, name='dispatch')
class Uyeler(ListView):
model = User
paginate_by = 40
ordering = ['-pk']
template_name = "panel/uyeler.html"
Run Code Online (Sandbox Code Playgroud)
并在模板文件中:
{% for obj in object_list %}
{% if obj.is_superuser %}
SuperUser
{% else %}
Not SuperUser {{ obj.is_superuser }}
{% endif %}
{% endfor %}
Run Code Online (Sandbox Code Playgroud)
对于包括我的超级用户帐户在内的所有用户,我的 html 输出都是“ Not SuperUser False ”。有任何想法吗?
我的自定义用户模型:
class MyUser(AbstractBaseUser):
username = models.CharField(unique=True,max_length=30)
email = models.EmailField(unique=True,max_length=75)
is_staff = models.IntegerField(default=False)
is_active = models.IntegerField(default=False)
date_joined = models.DateTimeField(default=None)
# Use default usermanager
objects = UserManager()
USERNAME_FIELD = 'email'
Run Code Online (Sandbox Code Playgroud)
有没有办法指定多个USERNAME_FIELD?有类似的东西['email','username'],用户可以通过电子邮件和用户名登录?
django ×10
django-users ×10
django-admin ×2
python ×2
django-forms ×1
django-views ×1
permissions ×1