【问题标题】:django creating Profile with custom company fieldsdjango 使用自定义公司字段创建个人资料
【发布时间】:2020-10-10 14:32:13
【问题描述】:

我有两个表单(OwnerCreateForm、EmployeesCreateForm)和 3 个模型(Profile、Company)。当所有者注册时,他创建了公司和他自己的用户对象。所有者登录后,他可以创建员工。我需要将业主公司与员工联系起来。 这是我正在使用的模型:

class Company(models.Model):
    company_name = models.CharField(max_length=100, unique=True)
    address = models.CharField(max_length=100)

    def __str__(self):
        return self.company_name


class Profile(models.Model):

    user = models.OneToOneField(User, on_delete=models.CASCADE)
    image = models.ImageField(default='default.jpg', upload_to='profile_pics')
    company = models.ForeignKey(Company, on_delete=models.CASCADE)
    is_owner = models.BooleanField(default=False)
    is_admin = models.BooleanField(default=False)
    is_manager = models.BooleanField(default=False)
    is_systemAdmin = models.BooleanField(default=False)

    def __str__(self):
        return '{} Profile'.format(self.user.username)

这里是表格:

from django.contrib.auth.forms import UserCreationForm
from .models import Company
from django import forms


class CompanyForm(forms.ModelForm):
    class Meta:
        model = Company
        fields = ('company_name', 'address')


class OwnerCreateForm(UserCreationForm):
    class Meta:
        fields = ('username', 'first_name', 'last_name', 'email', 'password1', 'password2')
        model = get_user_model()

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['username'].label = 'Display Name'
        self.fields['email'].label = "Email Address"


class EmployeesCreateForm(UserCreationForm):
    is_admin = forms.BooleanField(required=False)
    is_manager = forms.BooleanField(required=False)
    is_systemAdmin = forms.BooleanField(required=False)

    class Meta:
        fields = ('username', 'first_name', 'last_name', 'email', 'password1', 'password2')
        model = get_user_model()

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['username'].label = 'Display Name'
        self.fields['email'].label = "Email Address"

这是我的看法:

from django.shortcuts import render, redirect
from .forms import OwnerCreateForm, EmployeesCreateForm, CompanyForm
from .models import Profile
from django.contrib import messages
from django.contrib.auth.decorators import login_required
from .models import Profile,User


def create_profile_for_employee(form, company=None, is_owner = False):

    profile = Profile()
    username_employee = User(username=form.cleaned_data.get('username'))
    profile.company = username_employee.profile.company.pk
    profile.is_owner = form.cleaned_data.get('is_owner', False)
    profile.is_admin = form.cleaned_data.get('is_admin', False)
    profile.is_manager = form.cleaned_data.get('is_manager', False)
    profile.is_systemAdmin = form.cleaned_data.get('is_systemAdmin', False)


def registration_owner(request):
    if request.method == "POST":
        form = OwnerCreateForm(request.POST)
        company = CompanyForm(request.POST)
        if form.is_valid() and company.is_valid():
            company.save()
            form.save()
            messages.success(request, f'Your Account has been Created! You are now able to log in')
            return redirect("accounts:login")
    else:
        form = OwnerCreateForm()
        company = CompanyForm()

    context = {
        'title': 'Sign up Owner',
        'form': form,
        'company': company
    }
    return render(request, "accounts/signup.html", context)


@login_required()
def registration_employees(request):
    if request.method == "POST":
        form = EmployeesCreateForm(request.POST)
        if form.is_valid():
            form.save()
            create_profile_for_employee(form)
            messages.success(request, f'Your Account has been Created! You are now able to log in')
            return redirect("accounts:login")
    else:
        form = EmployeesCreateForm()

    context = {
        'title': 'Sign up Employees',
        'form': form,
    }
    return render(request, "accounts/signup.html", context)


@login_required()
def profile_view(request):
    return render(request, "accounts/profile.html")

正如您在 create_profile_for_employee() 中看到的,我正在尝试手动创建员工的个人资料,但我无法访问所有者公司。 任何帮助将不胜感激,谢谢,最好的

请注意,目前我以所有者身份登录。因为只有所有者才能创建员工用户。

【问题讨论】:

    标签: django django-models django-forms django-views


    【解决方案1】:

    请更改您的模型逻辑。我已经为你简化了。通过这种方式,您的视图将更加灵活。注册时,首先创建一个用户对象,然后将其作为 FK 传递给公司对象。现在,当您添加员工时,很容易将角色和公司分配给员工。此外,您可以根据您的确切需要通过进行微小的更改来使用建模逻辑。祝你好运:)

    class Company(models.Model):
        owner = models.ForeignKey(Owner, on_delete=models.CASCADE)
        company_name = models.CharField(max_length=100, unique=True)
        address = models.CharField(max_length=100)
    
        def __str__(self):
            return self.company_name
    
    
    class Profile(models.Model):
        user = models.OneToOneField(User, on_delete=models.CASCADE)
        image = models.ImageField(default='default.jpg', upload_to='profile_pics')
    
    
    class Owner(models.Model):
        profile = models.ForeignKey(Profile, on_delete=models.CASCADE)
    
    
    class Employee(models.Model):
        profile = models.ForeignKey(Profile, on_delete=models.CASCADE)
        role = models.ChoiceField(choices=STATUS_CHOICES)
        company=ForeginKey(Company,on_delete=models.CASCADE)
    STATUS_CHOICES = (
        (1, _("Admin")),
        (2, _("Manager")),
        (3, _("System Admin"))
    )
    

    【讨论】:

      猜你喜欢
      • 2012-08-30
      • 1970-01-01
      • 1970-01-01
      • 2011-08-19
      • 2018-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多