I am building a django web app with a custom user model which extends the AbstractBaseUser. In one of my models I need to use this custom user model:
from accounts.models import User
class History(models.Model):
user = models.ForeignKey(User)
job = models.ForeignKey(Job)
Run Code Online (Sandbox Code Playgroud)
When I try to run the python manage.py makemigrations command this error message is outputted:
ImportError: cannot import name User
Run Code Online (Sandbox Code Playgroud)
In my settings.py I do the following to let django know that there is a custom user model:
AUTH_USER_MODEL …Run Code Online (Sandbox Code Playgroud) 在 Django 中,我创建了一个自定义用户。
我的问题是默认验证器不起作用,任何密码都被接受。
我期望默认的密码验证器能够工作,因为我继承了默认的模型/表单类。
在 Django 设置中我有:
AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
'OPTIONS': {
'min_length': 12,
}
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
Run Code Online (Sandbox Code Playgroud)
]
自定义用户实现:
class User(AbstractBaseUser, MetaData, PermissionsMixin):
account = models.ForeignKey(Account, blank=True, null=True, related_name='owner', on_delete=models.CASCADE)
email = models.EmailField(max_length=255, unique=True)
first_name = models.CharField(max_length=255)
last_name = models.CharField(max_length=255)
is_confirmed = models.BooleanField(default=False) # email confirmed
is_active = models.BooleanField(default=False) # can't login
is_staff = models.BooleanField(default=False) # staff user non super
is_superuser = models.BooleanField(default=False) # superuser …Run Code Online (Sandbox Code Playgroud) 我删除了username字段,因为我希望用户能够使用他们的电子邮件地址登录,所以我在我的models.py:
class CustomUser(AbstractUser):
USER_TYPE = ((1, 'HOD'), (2, 'Staff'), (3, 'Student'))
username = None
email = models.EmailField(unique=True)
user_type = models.CharField(default=1, choices=USER_TYPE, max_length=1)
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = []
class Student(models.Model):
admin = models.OneToOneField(CustomUser, on_delete=models.CASCADE)
gender = models.CharField(max_length=1, choices=GENDER)
address = models.TextField()
profile_pic = models.ImageField(upload_to='media')
session_start_year = models.DateField(null=True)
session_end_year = models.DateField(null=True)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now_add=True)
Run Code Online (Sandbox Code Playgroud)
在我的views.py,我尝试过:
user = CustomUser.objects.create_user(email=email, password=password, user_type=3, first_name=first_name, last_name=last_name)
Run Code Online (Sandbox Code Playgroud)
但我的create_user() 缺少 1 个必需的位置参数:'用户名' 我该如何解决这个问题?
我想在我写过的自定义管理器中访问当前登录的用户.我想这样做,以便我可以过滤结果只显示他们有权访问的对象.
有没有这样做而没有实际传递它?类似于它在您可以执行request.user的视图中的工作方式.
谢谢
在views.py中,我有以下视图,在注册新用户帐户时会调用该视图.它所做的就是从请求中获取用户名,电子邮件和密码,然后尝试使用这些凭据创建用户.在下面的代码中,"A"被打印,但"B"没有,因为它崩溃了:
views.py
def register(request):
if request.method == 'POST':
query_dict = request.POST
username = query_dict['username']
email = query_dict['user_email']
password = query_dict['password']
role = query_dict['role']
print "A"
user = User.objects.create_user(username, email, password)
# the handler is called here and creates the user profile
print "B"
user = authenticate(username=username, password=password)
user_profile = user.get_profile()
user_profile.role = role
user_profile.save()
if user is not None and user.is_active:
login(request, user)
return HttpResponseRedirect("/")
Run Code Online (Sandbox Code Playgroud)
在myapp/models.py我有处理程序的以下代码.
'models.py`
post_save.connect(create_user_profile, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
print "created="+str(created)
if created: …Run Code Online (Sandbox Code Playgroud) 我正在使用Userena,我正在尝试捕获URL参数并将它们添加到我的表单中,但我失去了如何做到这一点.
我想在模板中做的是:
<a href="/accounts/signup/freeplan">Free Plan</a><br/>
<a href="/accounts/signup/proplan">Pro Plan</a><br/>
<a href="/accounts/signup/enterpriseplan">Enterprise Plan</a><br/>
Run Code Online (Sandbox Code Playgroud)
然后在我的urls.py中
url(r'^accounts/signup/(?P<planslug>.*)/$','userena.views.signup',{'signup_form':SignupFormExtra}),
Run Code Online (Sandbox Code Playgroud)
然后,理想情况下,我想在forms.py中使用该planslug在配置文件中设置用户计划.
我迷失了如何将捕获的URL参数放入自定义表单中.我可以使用extra_context,是否必须覆盖Userena注册视图?
我有一个需要登录用户信息的类方法(在视图之外)。如何在不将请求传递给方法的情况下检索登录用户?不幸的是,我找不到一个好的解决方案,而且不存在这样的方法是不合逻辑的,因为 Django 应该将登录用户存储在某个地方。否则,(我相信)这将是无法使用@login_required的装饰从django.contrib.auth.decorators。对?
那么,如果不可能,为什么不呢?如果我唯一想要的是登录用户而不是里面的所有信息,为什么 Django 会这样工作request?
提前致谢。
我用的时候
from django.conf import settings
Run Code Online (Sandbox Code Playgroud)
在我的DjangoRestFramework视图中,
class UserList(ListCreateAPIView):
queryset = settings.AUTH_USER_MODEL.objects.all()
serializer_class = UserSerializer
Run Code Online (Sandbox Code Playgroud)
我收到了错误
AttributeError at /users/
'str' object has no attribute 'objects'
Request Method: GET
Request URL: http://localhost:9999/users/
Django Version: 1.5.1
Exception Type: AttributeError
Exception Value:
'str' object has no attribute 'objects'
Run Code Online (Sandbox Code Playgroud) 我正在一个允许用户玩异步游戏的网站上创建.我正在使用Python 2.7.5运行Django 1.5,并使用Django的本机用户身份验证API.我没有创建自定义用户模型,而是将每个用户链接到自定义UserDetails类.UserDetails类的相关代码如下:
class UserDetails(models.Model):
user = models.OneToOneField(User)
join_date = models.DateTimeField(auto_now_add=True)
games = models.ManyToManyField(Game, default=None)
Run Code Online (Sandbox Code Playgroud)
每个游戏都使用ManyToMany字段链接到UserDetails.来自game.models的相关代码:
class Game(models.Model):
title = models.CharField(max_length=60)
create_date = models.DateTimeField(auto_now_add=True)
started = models.BooleanField(default=False)
players = models.ManyToManyField('user.UserDetails', default=None)
Run Code Online (Sandbox Code Playgroud)
在首页上,我想要一个列出正在进行的所有游戏的表格.在views.py中,我正在使用此命令:
games_in_signup = Game.objects.filter(started=False)
Run Code Online (Sandbox Code Playgroud)
...并将其传递给模板.最后,在模板中我有这个代码来生成表的行:
{% for g in games_in_signup %}
<tr>
<td>{{ g.title }}</td>
<td>{{ g.players|first }}</td>
<td>{{ g.number_of_players }}</td>
<td>{{ g.players.all|length }}</td>
<td>{{ g.create_date }}</td>
</tr>
{% endfor %}
Run Code Online (Sandbox Code Playgroud)
而不是像我希望的那样给我第一个玩家的用户名,我得到"TypeError at/game /'ManyRelatedManager'对象不支持索引".如果我尝试改变
<td>{{ g.players|first }}</td>
Run Code Online (Sandbox Code Playgroud)
...至...
<td>{{ g.players.all|first }}</td>
Run Code Online (Sandbox Code Playgroud)
...我在/ game /'UserDetails'对象中获得"AttributeError"没有属性'username'" …
我希望foreign key我的模型中的关系与表中的username字段User(存储user创建的django.contrib.auth.forms.UserCreationForm).
我的模型看起来如何:
class Blog(models.Model):
username = models.CharField(max_length=200) // this should be a foreign key
blog_title = models.CharField(max_length=200)
blog_content = models.TextField()
Run Code Online (Sandbox Code Playgroud)
该username字段应该是外键.外键应该在此字段中
django ×10
django-users ×10
python ×4
django-login ×1
django-orm ×1
django-views ×1
request ×1
userinfo ×1