1

所以我在 django 中创建了一个通用的“帐户”页面。我使用了 django-registration 插件,目前有一个(djang-standard)用户对象,以及一个 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

好的!编辑和保存的处理将通过mixindjango 的东西来完成,或者更可能是因为我还没有阅读过我自己的处理 post 和 get 的用户定义视图的 mixins。但是忽略这一点 - 因为我确定我应该使用 mixins - 上面的“对吗?” 或者有什么建议吗?

干杯!

4

1 回答 1

1

查看django docs 上的用户配置文件,那里列出了基础知识。您还应该看看在视图中使用表单

一些具体的反馈:

  • 您获得了正确的 UserProfile 模型,但是每次添加新用户时都必须创建一个实例(通过管理界面或在您的一个视图中以编程方式)。您可以通过注册到 Userpost_save信号来做到这一点:

    def create_user_profile(sender, instance, created, **kwargs):
        if created:
            UserProfile.objects.create(user=instance)
    post_save.connect(create_user_profile, sender=User)
    
  • 您应该使用 的实例来初始化 ModelForm UserProfile,而不是User. 您始终可以使用request.user.get_profile()(如果您 AUTH_PROFILE_MODULE在 settings.py 中定义)获取当前用户配置文件。您的视图可能如下所示:

    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 中进行初始化覆盖。无论如何,您将使用 UserProfile 实例调用它。如果要创建新用户,只需调用 User 构造函数:

    user = User()
    user.save()
    form = UserProfileForm(instance = user.get_profile())
    # ...
    
于 2012-07-06T10:32:14.653 回答