我正在django上的基於角色的訪問控制系統上工作,在註冊/註冊時,人員將被指定爲「部門」並將被分配一個「角色」因此,我創建的自定義用戶模型Django在提交註冊時創建用戶配置文件
models.py
from django.db import models
from django.contrib.auth.models import User
from django.db.models.signals import post_save
from django.dispatch import receiver
class Profile(models.Model):
DEPARTMENT_CHOICES = (
('Production', 'Production'),
('Marketing', 'Marketing'),
('IT', 'IT'),
('HR', 'HR'),
('Accounts', 'Accounts'),
)
ROLE_CHOICES = (
('Manager', 'Manager'),
('Team Lead', 'Team Lead'),
('Member', 'Member'),
)
user = models.OneToOneField(
User,)
department = models.CharField(
max_length=50, choices=DEPARTMENT_CHOICES, null=True)
role = models.CharField(max_length=50, choices=ROLE_CHOICES, null=True)
def __unicode__(self):
return unicode(self.user.first_name + ' ' + self.user.last_name)
def __str__(self):
return self.user.first_name + ' ' + self.user.last_name
def create_profile(sender, **kwargs):
if kwargs['created']:
user_profile = Profile.objects.create(user=kwargs['instance'])
pass
post_save.connect(create_profile, sender=User)
然後創建像
forms.py
from django import forms
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.models import User
from .models import Profile
class SignUpForm(UserCreationForm):
DEPARTMENT_CHOICES = (
('Production', 'Production'),
('Marketing', 'Marketing'),
('IT', 'IT'),
('HR', 'HR'),
('Accounts', 'Accounts'),
)
ROLE_CHOICES = (
('Manager', 'Manager'),
('Team Lead', 'Team Lead'),
('Member', 'Member'),
)
first_name = forms.CharField(
max_length=30, required=True, help_text='Optional.')
last_name = forms.CharField(
max_length=30, required=True, help_text='Optional.')
email = forms.EmailField(
max_length=254, required=False)
department = forms.ChoiceField(choices=DEPARTMENT_CHOICES,)
role = forms.ChoiceField(choices=ROLE_CHOICES,)
class Meta:
model = User
fields = ('first_name', 'last_name', 'username',
'email', 'password1', 'password2', 'department', 'role')
一種形式個
我的視圖
from django.shortcuts import render, redirect, render_to_response
from django.contrib.auth.decorators import login_required
from django.contrib.auth import login, authenticate
from .forms import SignUpForm
from .models import Profile
from django.shortcuts import get_object_or_404
from django.http import Http404
from django.contrib.auth.models import User
from django.template import RequestContext
def register(request):
if request.user.is_authenticated:
if request.user.is_superuser or request.user.role == 'Manager':
if request.method == 'POST':
form = SignUpForm(request.POST)
if form.is_valid():
user = form.save()
userprofile = Profile.objects.update(
user=user, department=form.cleaned_data['department'])
userprofile = Profile.objects.update(
user=user, role=form.cleaned_data['role'])
else:
form = SignUpForm()
c = {
'form': form,
}
return render(request, 'registration/register.html', c)
else:
raise Http404
else:
raise Http404
我register.html
{% extends 'layouts/base.html' %} {% load widget_tweaks %}{% block additionalbottom %}
<script>
var allParas = document.getElementsByTagName('div');
//filter by class name if desired...
for (var i = 0; i < allParas.length; i++) {
if (allParas[i].getElementsByTagName('*').length == 0) {
allParas[i].style.display = 'none';
}
}
</script>
{% endblock %} {% block content %}
<div class="login-page">
<div class="form">
<h2>User Registration</h2>
<form class="login-form" method="post">
{% csrf_token %}
<div class="row">
{% endblock %} {% for field in form %}
<div class="col-md-6">
{% if field.name == "first_name" or field.name == "last_name" %} {% render_field field class="form-control" placeholder=field.label.capitalize %} {% endif %}
</div>
<div class="col-md-6">
{% if field.name == "username" or field.name == "email" %} {% render_field field class="form-control" placeholder=field.label.capitalize %} {% endif %}
</div>
<div class="col-md-6 form-group">
{% if field.name == "department" or field.name == "role" %} {% render_field field class="form-control" placeholder=field.label.capitalize %} {% endif %}
</div>
<div class="col-md-12">
{% if field.name == "password1" %} {% render_field field class="form-control" placeholder=field.label.capitalize %} {% endif %}
</div>
<div class="col-md-12">
{% if field.name == "password2" %} {% render_field field class="form-control" placeholder=field.label.capitalize %} {% endif %}
</div>
{% endfor %}
</div>
<div class="form-group">
<button type="submit">Register</button>
</div>
</form>
{% if form.errors %} {% for field in form %} {% for error in field.errors %}
<div class="alert alert-danger">
<strong>{{ error|escape }}</strong>
</div>
{% endfor %} {% endfor %} {% for error in form.non_field_errors %}
<div class="alert alert-danger">
<strong>{{ error|escape }}</strong>
</div>
{% endfor %} {% endif %}
</div>
現在當過我嘗試提交我的形式,它說
IntegrityError在/註冊/ column user_id不唯一
我試圖從谷歌這麼多的解決方案和SO似乎沒有任何解決問題誰能告訴我如何解決它或它爲什麼不能做,如果它不能做什麼工作都是圍繞
這看起來很奇怪:'Profile.objects.update(user = user,department = form.cleaned_data ['department'])''。也許你想首先由用戶過濾,然後進行更新:'Profile.objects.filter(user = user).update(...)' –
順便說一句,你的'SignUpForm'使用'User'作爲模型在字段列表中指定'角色'和'部門'不會幫助你... –