2017-04-22 150 views
-1

我正在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似乎沒有任何解決問題誰能告訴我如何解決它或它爲什麼不能做,如果它不能做什麼工作都是圍繞

+0

這看起來很奇怪:'Profile.objects.update(user = user,department = form.cleaned_data ['department'])''。也許你想首先由用戶過濾,然後進行更新:'Profile.objects.filter(user = user).update(...)' –

+0

順便說一句,你的'SignUpForm'使用'User'作爲模型在字段列表中指定'角色'和'部門'不會幫助你... –

回答

0

這是你的問題。

Profile.objects.update(user=user, department=form.cleaned_data['department']) 

這將嘗試更新所有型材相同的數據。如果您有多個配置文件,那麼這是不允許的,因爲用戶是一對一的關係。

我想你想要做的是創建一個新的配置文件對象。嘗試是這樣的:

Profile.objects.create(
    user=user, 
    department=form.cleaned_data['department'], 
    role=form.cleaned_data['role'], 
) 

如果您使用的信號,當你保存一個新的用戶創建配置文件,您可以用update_or_create代替。

Profile.objects.update_or_create(
    user=user, 
    defaults={ 
     "department": form.cleaned_data['department'], 
     "role": form.cleaned_data['role'], 
    } 
) 
+0

如果我做object.create它會創建兩個配置文件實例 –

+0

並根據你的指令更新我的代碼後,它仍然說'列user_id不是獨特' –

+0

是你的追溯?您應該將追溯添加到問題中。沒有回溯,你如何期待任何人對此進行調試。 _TRACEBACK_是必不可少的。 –

相關問題