如何创建AbstractUser

时间:2014-08-26 10:46:54

标签: python django

对于帐户类型,我使用AbstractUser来构建我的模型

class Profile(AbstractUser):
    pass
class Second(Profile)
    #fields here
class Third(Profile)
    #fields here

相应的表格如下

class UserForm(ModelForm):
    class Meta:
        model = User
        fields = ('username', 'email', 'password')

class SecondForm(ModelForm):
    class Meta:
        model = Artist
        fields = ('artist_name', 'music_genre', 'profile_image')

我不知道这是定义模型功能的正确方法

我现在的问题是如何创建用户包括second modelThird model字段。 我有HTML页面,用户可以选择要创建的帐户USerType ..

def letsadduser(request):
    if request.method == "POST":
        form = UserForm(request.POST)
        form_second = SecondForm(request.POST, request.FILES)
        if form.is_valid() and form_second.is_valid():
            User = get_user_model()
            new_user = User.objects.create_user(**form.cleaned_data)
            Second_user = Second()
            Second_user.artist_name = request.POST['artist_name']
            Second_user.music_genre = request.POST['music_genre']
            Second_user.profile_image = request.FILES['profile_image']

            new_user.save()
            Second_user.save()      

            #login(request, new_user)
            return render_to_response('welcome.html')
    else:
        form = UserForm()
        form_second = SecondForm()

    return render(request, 'registration/test.html', {'form_second': form_second, 'form':form})

错误(1062,"重复输入''用于键'用户名'")现在抛出。 但它创建用户,我觉得第二种形式不起作用..  如何解决这个错误?

1 个答案:

答案 0 :(得分:1)

我看到了这些线条,并且非常注意到你遇到的问题:

class Profile(AbstractUser):
    pass
class Second(Profile)
    #fields here
class Third(Profile)
    #fields here

创建用户时:

User = get_user_model()
new_user = User.objects.create_user(**form.cleaned_data)

您正在创建用户。

创建第二个用户时:

Second_user = Second()
Second_user.artist_name = request.POST['artist_name']
Second_user.music_genre = request.POST['music_genre']
Second_user.profile_image = request.FILES['profile_image']
Second_user.save()

您未填充username字段。 也许您至少运行此代码两次,并且数据库中存在空用户记录。

然而,最重要的问题不是你问的问题。最大的问题如下:

  1. 您在用户上拨打create。创建用户条目。
  2. 您在第二个实例上构建并调用save创建另一个用户条目,并创建第二个条目。
  3. 您在save d用户上冗余地致电create。此通话无效。
  4. 因此,您要创建两个用户条目。如果您想让一个用户拥有两个配置文件,则必须修复该模型。目前你有:

    class Profile(AbstractUser):
        pass
    
    class Second(Profile)
        #fields here
    
    class Third(Profile)
        #fields here
    
    1. 如果您没有向AbstractUser添加字段:为什么不使用默认用户? (只是方便;不是修复的一部分)。

      User = get_user_model()
      
    2. 您需要制作个人资料,而不是子级,因此用户可能属于两个个人资料。这是一个完全不同的OOP概念。所以这个问题不是关于Django而是关于OOP。

      class Second(Model):
          user = ForeignKey(User, ...params...)
          ...fields...
      
      class Third(Model):
          user = ForeignKey(User, ...params...)
          ...fields...
      
    3. 您需要修复您的呼叫以使用第二个配置文件实例化用户:

      User = get_user_model()
      new_user = User.objects.create_user(**form.cleaned_data)
      
      Second_user = Second()
      Second_user.user = new_user
      Second_user.artist_name = request.POST['artist_name']
      Second_user.music_genre = request.POST['music_genre']
      Second_user.profile_image = request.FILES['profile_image']
      Second_user.save()
      
    4. 为了上帝的缘故让你的观点成为原子/交易!您正在添加多条记录。