标签: django-profiles

Django:扩展User时,最好使用OneToOneField(User)或ForeignKey(User,unique = True)?

我正在通过扩展Django User模型找到有关是否使用OneToOneField(User)ForeignKey(User, unique=True)创建UserProfile模型的相互矛盾的信息.

使用它更好吗?:

class UserProfile(models.Model):
    user = models.ForeignKey(User, unique=True)
Run Code Online (Sandbox Code Playgroud)

或这个?:

class UserProfile(models.Model):
    user = models.OneToOneField(User)
Run Code Online (Sandbox Code Playgroud)

Django的文件规定OneToOneField,而Django的书例子使用ForeignKey.

詹姆斯贝内特也有两篇博客文章,也提供了相互矛盾的例子:

在前一篇文章中,Bennett提供了一些原因,为什么他转而使用ForeignKey而不是OneToOneField,但我不太明白,特别是当我看到推荐相反的其他帖子时.

我很想知道你的偏好和原因.或者,它甚至重要吗?

django django-models django-profiles django-users

29
推荐指数
3
解决办法
2万
查看次数

使用Django注册应用程序在Django中处理帐户/配置文件的好地方在哪里?

我注意到在我登录Django注册后,它重定向到我accounts/profile/.默认情况下Django注册url.py没有处理accounts/profile/,所以我需要创建自己的.

实际上这个问题有三个方面:

  1. 登录后为什么会重定向到accounts/profile/?有办法改变吗?成功登录后,我希望Django能够在登录页面之前重定向回页面.
  2. 如果我要创建自己的视图和模板accounts/profile/,那么我应该把它放在哪里?Django的内置users(auth_user)在项目中的所有Django应用程序之间共享,所以我应该将它view.py放在项目文件夹中而不是放在app文件夹中吗?
  3. 或者Django的个人资料实际上是在照顾这一切account/profiles/?我已经User用自己的方式扩展了Django的课程UserProfile,但它更像是User桌面上的其他字段而不是实际的"配置文件"(我没有创建头像或类似的东西,只是简单的东西,如地址和电话号码,但最重要的是,一些我的应用依赖的自定义用户类型.

python django django-profiles django-registration

20
推荐指数
2
解决办法
6159
查看次数

在django中为不同类型的用户提供不同配置文件的最佳方法是什么?

在我的申请中,我有学生,教授和工作人员.工作人员不需要个人资料,但教授和学生都需要不同的个人资料.我宁愿不自己实现它(中间件和诸如此类的东西),所以有没有让get_profile()根据用户的角色返回不同的配置文件?

django django-profiles

6
推荐指数
1
解决办法
577
查看次数

使用django-profiles和django-registration的不同用户配置文件

我的models.py:

USER_TYPES = (                                                                                                                                                                   
    ('D', 'Demo'   ),                                                                                                                                                               
    ('F', 'Free'   ),
    ('P', 'Premium'),                                                                                                                                                        
)                                                                                                                                                                                                                                                                                                                                                                

class BaseProfile(models.Model):                                                                                                                                                 
    user      = models.OneToOneField(User, primary_key=True)                                                                                                                     
    user_type = models.CharField(max_length=1, blank=True, choices=USER_TYPES)                                                                                                           

class DemoProfile(models.Model):                                                                                                                                                 
    user      = models.OneToOneField(User, primary_key=True)                                                                                                                     
    demo      = models.CharField(max_length=10, blank=True) 
    ...

class FreeProfile(models.Model):                                                                                                                                                 
    user      = models.OneToOneField(User, primary_key=True)                                                                                                                     
    free      = models.CharField(max_length=10, blank=True) 
    ...

class PremiumProfile(models.Model):                                                                                                                                                 
    user      = models.OneToOneField(User, primary_key=True)                                                                                                                     
    premium    = models.CharField(max_length=10, blank=True) 
    ...

class ProxyProfile(BaseProfile):                                                                                                                                                 
    class Meta:                                                                                                                                                                  
        proxy = True             
    def get_profile(self):                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     
        if self.user_type == 'D':                                                                                                                                              
            return DemoProfile._default_manager.get(user__id__exact=self.user_id)                                                                                              
        elif self.user_type == 'F':                                                                                                                                            
            return FreeProfile._default_manager.get(user__id__exact=self.user_id)                                                                                              
        else:                                                                                                                                                                  
            return …
Run Code Online (Sandbox Code Playgroud)

user-interface django-profiles django-registration

6
推荐指数
1
解决办法
2244
查看次数

使用 django-allauth 的多个注册流程和配置文件类型

我有两种用户一种用户必须付费才能注册到该站点,并且他可以执行一系列操作。在第二个可以注册和登录免费(与他们的Facebook或谷歌或用户名和密码),并可以执行不同的一套动作。

两者都需要有个人资料和自定义字段,当然,用户类型会有所不同。

  • 是否可以使用django-allauth来实现?
  • 如果不是,使用另一个注册应用程序(例如django-registration)来处理付费用户和 django-allauth 用于社交登录是个好主意吗?他们会冲突吗?
  • 更好的方法来做到这一点?

django django-profiles django-registration django-users django-allauth

5
推荐指数
0
解决办法
325
查看次数

'ImageFieldFile' 对象只有在图片已经上传之后才没有属性 'content_type' 然后既不更改也不删除

我正在开发一个同时使用 django 注册和 django 配置文件的项目。我有一个允许用户编辑/创建个人资料的表单,其中包括上传照片。在以下情况下一切正常:创建或编辑配置文件并且从未上传过任何图像;编辑/创建配置文件并上传图像;上传图像后,只要更改或删除先前上传的图像,就可以编辑配置文件......我遇到问题的地方是是否存在现有的配置文件图像,并且用户尝试编辑他的/她的配置文件而不对当前图像进行任何更改(即删除或替换它)。在这种情况下,我收到错误“ImageFieldFile”对象没有属性“content_type”。关于为什么会发生这种情况的任何想法。我已经尝试了在堆栈溢出中找到的其他答案的变体,但无法让它们中的任何一个像它们所说的那样工作。我目前拥有的是我所做的更改之一的变体:

class UserProfileForm(ModelForm):
    def __init__(self, *args, **kwargs):
        super(UserProfileForm, self).__init__(*args, **kwargs)
        try:
            self.fields['email'].initial = self.instance.user.email
        except User.DoesNotExist:
            pass

    email = forms.EmailField(label="Primary email", help_text='')

    class Meta:
        model = UserAccountProfile
            exclude = ('user', 'broadcaster', 'type')
            widgets = {
            ...
        }


    def save(self, *args, **kwargs):
        u = self.instance.user
        u.email = self.cleaned_data['email']
        u.save()
        profile = super(UserProfileForm, self).save(*args,**kwargs)
        return profile

    def clean_avatar(self):
        avatar = self.cleaned_data['avatar']            

        if avatar:
            w, h = get_image_dimensions(avatar)
            max_width = max_height = 500
            if w >= max_width or h …
Run Code Online (Sandbox Code Playgroud)

django django-models django-forms django-profiles

3
推荐指数
1
解决办法
8052
查看次数

当模型不是文件而是目录时,django中的AUTH_PROFILE_MODULE值

我有以下内容:(它按预期工作)

# In <..>/profile/models.py
class UserProfile()
#In settings.py
AUTH_PROFILE_MODULE = "profile.UserProfile"
Run Code Online (Sandbox Code Playgroud)

我有以下内容:(不工作)

# In <..>/profile/models/__init__.py
class UserProfile()
AUTH_PROFILE_MODULE = "profile.UserProfile"
Run Code Online (Sandbox Code Playgroud)

似乎get_profile()调用get_model,它正在寻找models.py作为文件并尝试加载它.

这是错误:

提升SiteProfileNotAvailable('无法加载配置文件'SiteProfileNotAvailable:无法加载配置文件模型,请检查项目设置中的AUTH_PROFILE_MODULE

原因是我在配置文件应用程序中有很多类,它们都在不同的文件中并导入:

<..>/profile/models/__init__.py
Run Code Online (Sandbox Code Playgroud)

这适用于除get_profile()之外的所有其他内容.

任何变通方法的暗示?

django django-models django-profiles

2
推荐指数
1
解决办法
2964
查看次数

django-registration create_user()意外关键字

我正在尝试创建自定义配置文件以添加其他字段django-registration.这是我到目前为止的代码 -

models.py

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

class Profile(models.Model):
    user = models.ForeignKey(User, unique=True)
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
    email = models.CharField(max_length=50)
    password = models.CharField(max_length=50) 
Run Code Online (Sandbox Code Playgroud)

并在 settings.py

AUTH_PROFILE_MODULE = 'myproject.Profile'

但是,当我尝试使用create_user()时,我收到以下错误.当我在解释器中输入时会发生什么 -

>>> from django.contrib.auth.models import User
>>> User.objects.create_user(first_name='tom',last_name='smith',email='ts@gmail.com',password='hello')
Traceback (most recent call last):
  File "<console>", line 1, in <module>
TypeError: create_user() got an unexpected keyword argument 'first_name'
Run Code Online (Sandbox Code Playgroud)

为了create_user()识别这些新列,我缺少什么?谢谢.

django django-profiles django-registration

1
推荐指数
1
解决办法
3198
查看次数

Django-profiles,用户档案和Geo字段?

我是第一次使用django-profiles,所以我可能会遗漏一些基本的东西.

我想创建一个包含地理字段的UserProfile模型.特别是这些方面的东西:

class UserProfile(models.Model):
    user = models.OneToOneField(User)
    phone = PhoneNumberField()
    address = models.CharField(max_length=200)
    distance = models.IntegerField()
    zone = models.ForeignKey(Hood, null=True, blank=True)
    location = models.PointField(srid=900913, null=True, blank=True)
    objects = models.GeoManager()
Run Code Online (Sandbox Code Playgroud)

我正在从contrib.gis.db导入模型,并从auth导入通用用户模型.

当我尝试运行syncdb时,我收到以下错误:

AttributeError: 'module' object has no attribute 'PointField'
Run Code Online (Sandbox Code Playgroud)

django-profiles geodjango

1
推荐指数
1
解决办法
1591
查看次数

Django {{profile}}在模板中全局可用

我正在使用django-registration和django-profiles构建应用程序.在页面的任何地方我都有显示当前登录用户数据的部分(如名字和姓氏,使用如下的语法{{ user.first_name }}),它工作正常.它是通过子页面模板完成的,这些模板扩展了一个带有HTML结构的主模板和提到的部分.

现在我尝试将用户图像(使用{{ profile.image }})添加到该部分,并且{{ profile }}模板变量的可用性存在问题,但在以下页面中:

settings.py我有:

AUTH_PROFILE_MODULE = 'intranet.UserProfile'

TEMPLATE_CONTEXT_PROCESSORS = (
   'django.core.context_processors.static',
)
Run Code Online (Sandbox Code Playgroud)

添加"django.contrib.auth.context_processors.auth",TEMPLATE_CONTEXT_PROCESSORS不会改变任何东西.

models.py中的我的UserProfile类是:

class UserProfile(models.Model):
    user = models.OneToOneField(User)
    image = models.ImageField(upload_to=user_image_name,
        blank=True, null=True, verbose_name='User photo')
Run Code Online (Sandbox Code Playgroud)

urls.py:

(r'^profiles/edit/', 'profiles.views.edit_profile', {'form_class': ProfileForm, }),
(r'^profiles/', include('profiles.urls')),
Run Code Online (Sandbox Code Playgroud)

所以其余部分默认设置在django-profiles urls.py文件中.

我希望能够在应用程序的 {{ profile }} 模板中的任何地方(不仅在配置文件页面上)使用模板变量,以便可以在由其他模板扩展的主模板中使用它.

请让我知道如何才能得到这个.任何帮助将非常感激.

我在版本1.3.1中使用Django,在版本0.7中使用django-registration,在版本0.2中使用django-profiles.

django templates django-templates profiles django-profiles

0
推荐指数
1
解决办法
1223
查看次数