2016-06-24 15 views
1

Cantは私の質問に明確に答えてくれそうです。Djangoユーザーモデルを拡張した後に新しいユーザーを作成する

あなたのような基本的なコードでDjangoのユーザモデルを拡張する場合:

class Employee(models.Model): 
    user = models.OneToOneField(User, on_delete=models.CASCADE) 
    department = models.CharField(max_length=100) 

これはどのように新しいユーザーを作成するに影響しますか?新しいユーザーを作成すると、employeeクラスオブジェクトが自動的に作成されますか? departmentフィールドが必要な場合は、ユーザーオブジェクトと従業員オブジェクトを同時にどのように作成しますか?

+1

あなたは人の従業員は、従業員がすべき、Userクラスを拡張したい場合は、 "ユーザー" およびないmodels.Modelを拡張します。したがって、Employeはdepartementフィールドを持つユーザーです。 –

+0

それは本当ですか? Djangoのドキュメント(https://docs.djangoproject.com/en/dev/topics/auth/customizing/#extending-the-existing-user-model)からそのコードを直接入手しました – manchakowski

+0

あなたの質問を読んで(つまり、ユーザーを作成してくださいオブジェクトと従業員オブジェクトを同時に)、私はEmployeeがUserを拡張したかったと思っています。それは、Employeeをインスタンス化するだけで継承されるため、UserでもあるEmployeeを作成することは可能です。しかし、フレームワークがあなたにそれを行う一つの方法を示しているならば、是非、 "djangoのやり方" –

答えて

2

employeeオブジェクトは自動的には作成されません。同時にuserオブジェクトとemployeeオブジェクトを作成するには、時間やユーザー作成時に採用インスタンスを作成する場合、作成するDjangoの信号を使用することができ、そのような

employee = Employee(user=user, depatment='xyz') 
employee.save() 
4

としてuserインスタンスを使用することができます新しいユーザーが作成されると、インスタンスが自動的に作成されます。

models.py

from django.db.models.signals import * 
from __future__ import unicode_literals 

class Employee(models.Model): 

    userName = models.OneToOneField(User, related_name='profile') 
    department = models.CharField(max_length=100, null=True) 

    def __unicode__(self): # __str__ 
     return unicode(self.userName) 

def create_user_profile(sender, instance, created, **kwargs): 
    if created: 
    Employee.objects.create(userName=instance) 

post_save.connect(create_user_profile, sender=User) 

新しいユーザーが作成されたとき、これは自動的に(空白のインスタンスのデータが後に追加することができます)、従業員のインスタンスを作成します。

ユーザーモデルを拡張したいとユーザを作成しながら、さらに情報を追加したい場合は、ジャンゴ・betterforms(http://django-betterforms.readthedocs.io/en/latest/multiform.html)を使用することができます

models.py

from django.db.models.signals import * 
from __future__ import unicode_literals 

class Employee(models.Model): 

    userName = models.OneToOneField(User, related_name='profile') 
    department = models.CharField(max_length=100) 

    def __unicode__(self): # __str__ 
     return unicode(self.userName) 

forms.py

from django import forms 
from django.forms import ModelForm 
from betterforms.multiform import MultiModelForm 
from django.contrib.auth.forms import UserCreationForm 
from .models import * 

class EmployeeForm(ModelForm): 

    class Meta: 
     model = Employee 
     exclude = ('userName',) 


class addEmployeeMultiForm(MultiModelForm): 
    form_classes = { 
     'user':UserCreationForm, 
     'profile':EmployeeForm, 
    } 

views.py

from django.views.generic import CreateView 
from django.shortcuts import redirect 
from .models import * 
from .forms import * 

class addEmployee(CreateView): 
    form_class = addEmployeeMultiForm 
    template_name = "addEmployee.html" 
    success_url = '/your url after user created' 

    def form_valid(self, form): 
     user = form['user'].save() 
     profile = form['profile'].save(commit=False) 
     profile.userName = User.objects.get(username= user.username) 
     profile.save() 
     return redirect(self.success_url) 

urls.py

from .views import * 

      urlpatterns = [ 
       url(r'^addemp/$', addEmployee.as_view(), name='addemp'), 
      ] 

addEmployee.html

<!DOCTYPE html> 
<html lang="en"> 
    <head> 
     <meta charset="UTF-8"> 
     <title>Title</title> 
    </head> 
    <body> 
     <form action="." method="post"> 
      {% csrf_token %} 
      {{ form }}  
      <button type="submit">Add</button> 
     </form> 
    </body> 
</html> 
関連する問題