Как установить значение поля при создании пользователя, основываясь на значении текущего пользователя - PullRequest
1 голос
/ 26 апреля 2019

Я создаю форму, где пользователи могут регистрировать дополнительных пользователей, и мне нужно автоматически передать внешний ключ (организацию) текущего пользователя новому создаваемому пользователю.

Я относительно новичок в Django, но я думаю, что проблема в следующей строке в формах:

"user.organization = self.instance.organization"

Модель

class Organization(models.Model):
    name = models.CharField(max_length=255)
    address = models.CharField(max_length=255)
    city = models.CharField(max_length=255)
    state = models.CharField(max_length=255)
    zip = models.CharField(max_length=255)

class User(AbstractUser):
    username = None
    email = models.EmailField(_('email address'), unique=True)
    organization = models.ForeignKey(Organization, on_delete=models.CASCADE, blank=True, null=True)
    client = models.ForeignKey(Client, on_delete=models.CASCADE, blank=True, null=True)
    user_type = models.CharField(max_length=255, choices=(('org_admin', 'Admin'),('org_user','User'),('client_admin','Client Admin'),('client_user','Client User')))

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = []

    objects = UserManager()

View

def register(request):
    if request.method == 'POST':
        form = UserOrgCreationForm(request.POST)
        if form.is_valid():
            form.save()
            email = form.cleaned_data.get('email')
            messages.success(request, f'User has been created')
            # return redirect('login')
    else:
        form = UserOrgCreationForm()
    return render(request, 'users/register.html', {'form': form})

Форма

class UserOrgCreationForm(UserCreationForm):

    password1 = None
    password2 = None

    class Meta:
        model = User
        fields = ('email', 'first_name', 'last_name', 'user_type')

    def save(self, commit=True):
        user = super(UserCreationForm, self).save(commit=False)
        user.set_unusable_password()
        user.organization = self.instance.organization
        if commit:
            user.save()
        return user

Мне нужен новый пользователь, чтобы унаследовать организацию текущего пользователя.

Ответы [ 3 ]

1 голос
/ 26 апреля 2019

Поскольку ваша форма не основана на существующем экземпляре (не передается при создании экземпляра формы), вы не можете ссылаться на него при сохранении.

Вы можете делать то, что хотите в представлении, как показано ниже

def register(request):
    if request.method == 'POST':
        form = UserOrgCreationForm(request.POST)
        if form.is_valid():
            new_user = form.save(commit=False)
            new_user.organization = request.user.organization
            new_user.save()
            email = form.cleaned_data.get('email')
            messages.success(request, f'User has been created')
            # return redirect('login')
    else:
        form = UserOrgCreationForm()
    return render(request, 'users/register.html', {'form': form})
0 голосов
/ 26 апреля 2019

Вам необходимо получить доступ к request.user.organisation форме сохранения формы.

class UserOrgCreationForm(UserCreationForm):

    password1 = None
    password2 = None

    class Meta:
        model = User
        fields = ('email', 'first_name', 'last_name', 'user_type')

    def save(self, commit=True):
        user = super(UserCreationForm, self).save(commit=False)
        user.set_unusable_password()
        user.organization = current_user.organization
        if commit:
            user.save()
        return user

    def __init__(self,*args,**kwargs):
        self.current_user = kwargs.pop("current_user", None)
        super(UserOrgCreationForm,self).__init__(*args,**kwargs)

А из вида:

def register(request):
    form = UserOrgCreationForm(request.POST or None, current_user=request.user)
    if form.is_valid():
        form.save()
        email = form.cleaned_data.get('email')
        messages.success(request, f'User has been created')
        # return redirect('login')

    return render(request, 'users/register.html', {'form': form})
0 голосов
/ 26 апреля 2019

Вы можете использовать commit=False параметр .Это не сохранит форму в базе данных, пока .save() не будет вызван во второй раз.

def register(request):
    if request.method == 'POST':
        form = UserOrgCreationForm(request.POST)
        if form.is_valid():
            obj = form.save(commit=False)
            obj.organization = request.user.organization
            obj.save()
            email = form.cleaned_data.get('email')
            messages.success(request, f'User has been created')
            # return redirect('login')
    else:
        form = UserOrgCreationForm()
    return render(request, 'users/register.html', {'form': form})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...