django – 如何在注册后在allauth中自定义用户配置文件字段

我使用allauth在我的Web应用程序中注册功能.在socialaccount注册是从用户收集的电子邮件,密码,名字和姓氏.在登录表单中,我只是收集用户的电子邮件和密码.

一旦记录,我的应用程序会将用户重定向到个人资料页面,在该页面中,如果他/她想要这样做,他/她应该更新她的个人资料(包括新的和自定义的字段,作为我添加的“机构”).

作为django-allauth的初学者的问题,我想知道如何将这些新的自定义字段添加到我的用户配置文件中,以及如何在用户注册后更新这些数据.

到目前为止我做了什么:

在settings.py中

AUTH_USER_MODEL = 'auth.User'

在my_project / models.py中

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

class UserProfile(models.Model):

    institution = models.TextField(max_length=254)

在profile_page.html中

{% extends 'base.html' %}
{% block title %}Profile Page{%endblock title%}

{% if user.is_authenticated %}

{%block body%}

    <div class="col-md-6" >
        <div class="panel panel-default">
            <div class="panel-body">
                <h1 class="text-center"><b>MY ONTOLOGIES</b></h1><br>
            </div>
        </div>
    </div>
    <div class="col-md-6" >
        <div class="panel panel-default">
            <div class="panel-body">
                <h1 class="text-center"><b>MY PROFILE</b></h1><br>
                    <div class="form-group">
                        {% csrf_token %}
                        <label for="id_login" class="col-sm-2 control-label">E-mail:</label>
                        <div class="col-sm-10">
                            <input type="email" id="asd" value="{{user.email}}" name="login"   class="form-control" required />
                        </div><br><br>
                        <label for="first_name" class="col-sm-2 control-label">First Name:</label>
                        <div class="col-sm-10">
                            <input type="text" id="id_first_name" value="{{user.first_name}}" name="first_name" class="form-control" required />
                        </div><br><br>
                        <label for="last_name" class="col-sm-2 control-label">Last Name:</label>
                        <div class="col-sm-10">
                            <input type="text" id="id_last_name" value="{{user.last_name}}" name="last_name" class="form-control" required />
                        </div><br><br>
                        <label for="institution" class="col-sm-2 control-label">Institution:</label>
                        <div class="col-sm-10">
                            <input type="text" id="id_institution" value="{{user.institution}}" name="institution" class="form-control" placeholder="University/Company" required />
                        </div><br><br>
                        <label for="id_password1" class="col-sm-2 control-label">New Password:</label>
                        <div class="col-sm-10">
                            <input class="form-control" id="id_password1" name="password1" placeholder="New Password" type="password" />
                        </div><br><br>
                        <label class="col-sm-2" for="id_password2">New Password (again):</label>
                        <div class="col-sm-10">
                            <input class="form-control" id="id_password2" name="password2" placeholder="New Password (again)" type="password" />
                        </div>

                    </div>
            </div>
        </div>
    </div>

{%endblock body%}

{% endif %}

代码显然是不完整的,因为我找不到添加字段的方法并按照我的要求正确保存它们.谢谢

最佳答案 我分两步解决了这个问题,并涉及重构我在我的问题中发布的代码:

>第一步(为user_table创建自定义字段):

首先,我在我的项目中添加了一个名为CustomUser的应用程序,我处理与allauth用户相关的任何问题.

在settings.py中

INSTALLED_APPS = [
    ...
    'CustomUser.apps.CustomuserConfig',
]

AUTH_USER_MODEL = 'CustomUser.CustomUser'

在CustomUser / models.py中

from __future__ import unicode_literals

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

class CustomUser(AbstractUser):
    add_your_custom_fields_here 

在CustomUser / apps.py中

from __future__ import unicode_literals

from django.apps import AppConfig


class CustomuserConfig(AppConfig):
    name = 'CustomUser'

在CustomUser / admin.py中

from django.contrib import admin
from .models import CustomUser

admin.site.register(CustomUser)

将自定义字段配置到用户表后,需要在shell中运行migrate命令以添加这些字段.在我的情况下,它不起作用,然后我需要刷新我的数据库并再次填充它.

>第二步是使用新用户表创建updateform.

首先,您需要从allauth覆盖User类.在CustomUser文件夹中创建form.py,我们有:

来自django进口表格
来自.models导入CustomUser

class UpdateUserForm(forms.ModelForm):
    class Meta:
        model = CustomUser
        # Add here the fields you want to be present in the update form
        fields = ('first_name', 'last_name', 'institution')

在CustomUser / templates / profile.html中,您需要为您的应用创建表单.在我的情况下,我创建了一个原始的:

Update your data <br><br>

<form action="." method="post">
    {% csrf_token %}
    {{ form }}
    <input type="submit" value="Submit" />
</form> 

在CustomUser / views.py中,您将配置profile.html页面的行为

from django.shortcuts import render
from .forms import UpdateUserForm
from django.http import HttpResponseRedirect
from django.views.generic import UpdateView
from django.core.urlresolvers import reverse_lazy

def profile(UpdateView):
    if request.method == 'POST':
        form = UpdateUserForm(request.POST)
        if form.is_valid():
            return HttpResponseRedirect('/accounts/profile/')
    else:
        form = UpdateUserForm()

    return render(request, 'profile.html', {'form':form})

class UserUpdate(UpdateView):
        form_class = UpdateUserForm
        template_name = 'profile.html'
        success_url = reverse_lazy('profile')

        #get object
        def get_object(self, queryset=None): 
            return self.request.user

最后,只需将profile.html页面添加到urls.py和voilà:

from CustomUser import views

url(r'^accounts/profile/$',  views.UserUpdate.as_view() , name='profile'), 

希望它可以帮助别人…谢谢

点赞