我正在添加一个系统,为下次登录时可以显示的用户留下"通知".我在models.py文件中创建了一个简单的Notification类.我有这个UserInfo类(在相同的models.py中)作为socialauth的一部分将一些属性添加到Django的现有用户系统:
class UserInfo(models.Model):
user = models.OneToOneField(User, unique=True)
...
reputation = models.IntegerField(null=True, blank=True)
def add_notification(message):
notification = Notification(user=self.user, message=message)
notification.save
Run Code Online (Sandbox Code Playgroud)
当我在控制台中尝试时,我最终得到了这个:
>>> user = User.objects.get(id=14)
>>> user.userinfo.add_notification('you are an awesome intern!')
Traceback (most recent call last):
File "<console>", line 1, in <module>
TypeError: add_notification() takes exactly 1 argument (2 given)
>>>
Run Code Online (Sandbox Code Playgroud)
我在这里错过了什么?我是一个Django noob,所以也许这很简单.谢谢!
我正在试图找出如何从中排除用户名和/或密码的方法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-registration将用户登录到我的应用程序中.那部分工作正常.我无法弄清楚的部分是如何在用户登录时设置自定义会话变量.例如,我想填充包含UserProfile数据的变量以及一些其他函数的输出.然后我就可以在后续的视图/模板中使用该信息.
如果有人可以在线指导我或者发布一些示例代码,那就太棒了.
我正在使用django 1.1和Python 2.6
我正在使用Django和django-allauth进行社交认证.
我已经启动并运行身份验证,但是任何人都可以举例说明如何:
例如,在主页上,我有
{% if user.is_authenticated %}
<li><a href="{% url account_logout %}?next=/">Logout</a></li>
{% endif %}
Run Code Online (Sandbox Code Playgroud)
这正确地显示了Logout链接,但是我如何添加用户的名字和头像?
像(伪代码)的东西:
<p>You're logged in with {{ user.account_provider? }} as {{ user }}.</p>
<img src="{{ user.avatar_url }}" />
Run Code Online (Sandbox Code Playgroud)
然后,如果我想为用户的个人资料添加额外的属性,我该怎么办?我应该使用其他一些Django用户相关的应用程序吗?
谢谢你的帮助.
我正在尝试使用AbstractUser向Django的标准用户模型添加字段.这是我的代码:
class GUser(AbstractUser):
uuid = UUIDField(auto=True)
Run Code Online (Sandbox Code Playgroud)
这是成功的,因为从壳我可以说,
>>> a = GUser.objects.all()
>>> a
[<GUser: User1>]
>>> a[0].uuid
UUID('7d1f0b7b52144a2ea20db81ce74741e3')
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是从/ admin注册一个新用户.当我创建一个新用户时,我收到一个数据库错误:
no such table: auth_user
Run Code Online (Sandbox Code Playgroud)
在我了解它之前,这是我的forms.py:
class GUserChangeForm(UserChangeForm):
class Meta:
model = get_user_model()
class GUserCreationForm(UserCreationForm):
class Meta:
model = get_user_model()
def clean_username(self):
username = self.cleaned_data["username"]
try:
get_user_model().objects.get(username=username)
except get_user_model().DoesNotExist:
return username
raise forms.ValidationError(self.error_messages['duplicate'])
Run Code Online (Sandbox Code Playgroud)
而我的admin.py:
class GUserAdmin(UserAdmin):
form = GUserChangeForm
add_form = GUserCreationForm
fieldsets = (
(None, {'fields': [('username', 'password')]}),
('Personal info', {'fields': ('is_active','is_staff','is_superuser','groups', 'user_permissions')}),
('Important dates', {'fields': ('last_login', 'date_joined')}),
#('Universal ID', …Run Code Online (Sandbox Code Playgroud) django django-forms django-admin django-authentication django-syncdb
我在我的项目中使用python-social-auth和电子邮件注册.对于用户模型,我使用AbstractBaseUser的子类:
class User(AbstractBaseUser):
USERNAME_FIELD = 'email'
AUTH_USER_MODEL = 'userprofile.User'
Run Code Online (Sandbox Code Playgroud)
但是,如果用他的电子邮件注册的用户(demo@demo.com)和密码尝试使用与同一电子邮件地址关联的Facebook帐户登录,则会收到以下错误:
IntegrityError at /social/complete/facebook/
duplicate key value violates unique constraint "userprofile_user_email_key"
DETAIL: Key (email)=(demo@demo.com) already exists.
/Users/vera/.virtualenvs/app/lib/python2.7/site-packages/django/core/handlers/base.py in get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs) ...
/Users/vera/.virtualenvs/app/lib/python2.7/site-packages/django/views/decorators/csrf.py in wrapped_view
return view_func(*args, **kwargs) ...
/Users/vera/.virtualenvs/app/lib/python2.7/site-packages/social/apps/django_app/utils.py in wrapper
return func(request, backend, *args, **kwargs) ...
/Users/vera/.virtualenvs/app/lib/python2.7/site-packages/social/apps/django_app/views.py in complete
redirect_name=REDIRECT_FIELD_NAME, *args, **kwargs) ...
/Users/vera/.virtualenvs/app/lib/python2.7/site-packages/social/actions.py in do_complete
*args, **kwargs) ...
/Users/vera/.virtualenvs/app/lib/python2.7/site-packages/social/strategies/base.py in complete
return self.backend.auth_complete(*args, **kwargs) ...
/Users/vera/.virtualenvs/app/lib/python2.7/site-packages/social/backends/facebook.py in auth_complete
return self.do_auth(access_token, response, *args, **kwargs) ...
/Users/vera/.virtualenvs/app/lib/python2.7/site-packages/social/backends/facebook.py …Run Code Online (Sandbox Code Playgroud) 我的自定义用户模型:
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'],用户可以通过电子邮件和用户名登录?
尝试将AWS Cognito用作Django身份验证后端是否有意义?这样做有什么好处?什么是挑战/问题领域?
有没有人朝这个方向做过任何工作?
django django-authentication boto amazon-web-services amazon-cognito
所以我用这样的字段扩展了我的用户score:
models.py:
class UserProfile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
score = models.IntegerField(default=0);
Run Code Online (Sandbox Code Playgroud)
这似乎与推荐的方式一致
然后我尝试在我的视图中访问用户userprofile:
views.py:
player = request.user.userprofile
Run Code Online (Sandbox Code Playgroud)
这也似乎与推荐的方式一致.但那是我收到错误的地方:
RelatedObjectDoesNotExist
User has no userprofile.
Run Code Online (Sandbox Code Playgroud)
如果我将userprofile更改为其他内容,我会收到另一个错误:
AttributeError
'User' object has no attribute 'flowerpot'
Run Code Online (Sandbox Code Playgroud)
当我尝试以下代码时:
print request.user
print UserProfile.objects.all()
Run Code Online (Sandbox Code Playgroud)
我得到控制台输出:
post_test1
[]
Run Code Online (Sandbox Code Playgroud)
编辑
我有两个超级用户,
我在扩展用户之前创建了七个用户,在扩展用户之后创建了
一个用户(post_test1).
EDIT_2
你好,我们又见面了!
因此它清楚地表明我需要的是
创建一个post_save处理程序,在创建User对象时创建一个新的配置文件
当我阅读它时,这似乎很简单,转到链接到的页面,其中列出了Django发送的所有信号.我查了一下post_save,它说:
像pre_save一样,但是在save()方法结束时发送.
好吧,所以我查看pre_save,它说:
这是在模型的save()方法的开头发送的.
我的解释是这样的:当我创建我的用户(在我的views.py中)时,应该调用save()方法(到目前为止还没有这种情况),之后应该发送post_save(? )当创建User对象时,它将创建一个新的配置文件!
所以现在我已经准备好开始查看示例,所以我谷歌:
userprofile
这里看起来我应该添加看起来像装饰器的东西userprofile
这里看起来我应该改变多个文件并写一个信号定义?
这个似乎也意味着多个文件(包括signals.py)
它看起来还有更多,然后我第一次想到.这里的任何人都可以解释我是如何做到的,或者向我展示一些关于信号如何工作的好资源?
现在我的create_users视图看起来像这样:
def create_user(request):
if request.method == "POST":
form = UserCreationForm(request.POST)
if form.is_valid(): …Run Code Online (Sandbox Code Playgroud) 我正在尝试根据本教程使用用户身份验证构建一个简单的网站,但遇到了上述错误。按照说明,我设置了一个网址如下:
url('^accounts/', include('django.contrib.auth.urls'))
Run Code Online (Sandbox Code Playgroud)
我收到此错误作为回应:'auth' 不是注册的命名空间所以我尝试注册一个命名空间,如教程存储库所示:
url('^accounts/', include('django.contrib.auth.urls', namespace="auth")),
Run Code Online (Sandbox Code Playgroud)
然后我收到错误:在 include() 中指定命名空间而不提供 app_name
我意识到本教程使用的是 django 1.8.3,但我使用的是 2.0。当我在 virtualenv 中切换到相同的 django 版本时,问题得到了解决,但我现在不得不更改项目中的许多其他内容以防止其崩溃。有什么方法可以在不需要 django 1.8 的情况下修复?谢谢。