我使用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'),
希望它可以帮助别人…谢谢