所以我在django中制作了一个通用的“帐户”页面。我使用了django-registration插件,目前有一个(djang标准)User对象,以及UserProfile和UserProfileForm对象。
这是一个关于风格或最佳实践的问题,我想。我正在计划“正确”或是否有“更好/推荐/标准的方式”来做到这一点?
我打算做的是从request.user创建UserProfile,即:
form = UserProfileForm(instance=User)
(并将该表单发送到视图),以及UserProfileForm:
class UserProfileForm(forms.ModelForm):
class Meta:
model = UserProfile
def __init__(self,*args,**kwargs):
super(UserProfileForm, self).__init__(*args, **kwargs)
if kwargs.has_key('instance'):
self.user = kwargs['instance']
我的UserProfile非常类似:
class UserProfile(models.Model):
user = models.OneToOneField(User)
points = models.IntegerField(default=0) #how is the user going with scores?
并且用户属于django.contrib.auth.models
种。
确定!编辑和保存的处理将通过mixin
django的东西完成,或者更可能是因为我没有读取mixins我自己的用户定义的视图来处理post和gets。但忽略这一点 - 因为我确定我应该使用mixins - 是上面的“对吗?”还是有建议吗?
喝彩!
答案 0 :(得分:1)
看看user profiles on the django docs,其中列出了基础知识。您还应该查看using a form in a view。
一些具体的反馈:
您的UserProfile模型正确,但每次添加新用户时都必须创建一个实例(通过管理界面或在您的一个视图中以编程方式)。您可以通过注册用户post_save
信号来执行此操作:
def create_user_profile(sender, instance, created, **kwargs):
if created:
UserProfile.objects.create(user=instance)
post_save.connect(create_user_profile, sender=User)
您应该使用UserProfile
的实例初始化ModelForm,而不是User
。您始终可以使用request.user.get_profile()
获取当前用户个人资料(如果您在settings.py中定义AUTH_PROFILE_MODULE
)。您的视图可能如下所示:
def editprofile(request):
user_profile = request.user.get_profile()
if request.method == 'POST':
form = UserProfileForm(request.POST, instance=user_profile)
if form.is_valid():
form.save()
return HttpResponseRedirect('/accounts/profile')
else:
form = UserProfileForm(instance=user_profile)
# ...
您的ModelForm中无需 init 覆盖。无论如何,您将使用UserProfile实例调用它。如果要创建新用户,只需调用User构造函数:
user = User()
user.save()
form = UserProfileForm(instance = user.get_profile())
# ...