2016-06-24 2 views
1

Невозможно найти ответ, который однозначно отвечает на мой вопрос.Создание нового пользователя после расширения пользовательской модели 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 является Пользователем с отделением. –

+0

Это правда? Я получил этот код непосредственно из документации Django по адресу https://docs.djangoproject.com/en/dev/topics/auth/customizing/#extending-the-existing-user-model – manchakowski

+0

Чтение вашего вопроса (т. Е. Создание пользователя объект и объект сотрудника одновременно), я хочу, чтобы вы хотели, чтобы Employee расширил пользователя. Можно создать Employee, который также является Пользователем, поскольку он наследует его, вы просто создаете экземпляр Employee. Но, если структура показывает вам один из способов сделать это, непременно следуйте «пути джанго», –

ответ

2

employee объект не создан автоматически. Чтобы создать user объект и employee объект в то же время, вы можете использовать экземпляр user как таковой

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

Если вы хотите создать экземпляр трудоустроить во время или создания пользователя вы можете использовать Джанго сигналы, которые будут создавать экземпляр автоматически при создании нового пользователя.

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> 
Смежные вопросы