我正在通过扩展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注册后,它重定向到我accounts/profile/
.默认情况下Django注册url.py
没有处理accounts/profile/
,所以我需要创建自己的.
实际上这个问题有三个方面:
accounts/profile/
?有办法改变吗?成功登录后,我希望Django能够在登录页面之前重定向回页面.accounts/profile/
,那么我应该把它放在哪里?Django的内置users
(auth_user
)在项目中的所有Django应用程序之间共享,所以我应该将它view.py
放在项目文件夹中而不是放在app文件夹中吗?account/profiles/
?我已经User
用自己的方式扩展了Django的课程UserProfile
,但它更像是User
桌面上的其他字段而不是实际的"配置文件"(我没有创建头像或类似的东西,只是简单的东西,如地址和电话号码,但最重要的是,一些我的应用依赖的自定义用户类型.在我的申请中,我有学生,教授和工作人员.工作人员不需要个人资料,但教授和学生都需要不同的个人资料.我宁愿不自己实现它(中间件和诸如此类的东西),所以有没有让get_profile()根据用户的角色返回不同的配置文件?
我的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) 我有两种用户:第一种用户必须付费才能注册到该站点,并且他可以执行一系列操作。在第二个可以注册和登录免费(与他们的Facebook或谷歌或用户名和密码),并可以执行不同的一套动作。
两者都需要有个人资料和自定义字段,当然,用户类型会有所不同。
django django-profiles django-registration django-users django-allauth
我正在开发一个同时使用 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) 我有以下内容:(它按预期工作)
# 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-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-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-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-profiles ×10
django ×8
django-users ×2
django-forms ×1
geodjango ×1
profiles ×1
python ×1
templates ×1