1
votes

Comment définir la valeur d'un champ lors de la création d'un utilisateur, en fonction de la valeur de l'utilisateur actuel

Je crée un formulaire où les utilisateurs peuvent enregistrer des utilisateurs supplémentaires, et je dois passer automatiquement la clé étrangère (organisation) de l'utilisateur actuel au nouvel utilisateur en cours de création.

Je suis relativement nouveau sur Django, mais je pense que le problème vient de la ligne suivante dans les formulaires:

"user.organization = self.instance.organization"

Model

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


0 commentaires

3 Réponses :


0
votes

Vous pouvez utiliser commit = False paramètre . Cela n'enregistrera pas le formulaire dans la base de données tant que .save () ne sera pas appelé une deuxième fois.

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})


0 commentaires

1
votes

Étant donné que votre formulaire n'est pas basé sur une instance existante (non transmis lors de la création de l'instance de formulaire), vous ne pouvez pas y faire référence lors de l'enregistrement.

Vous pouvez faire ce que vous voulez dans la vue comme ci-dessous

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})


1 commentaires

Assurez-vous d'encapsuler la vue avec le décorateur login_required pour vous assurer que request.user est un utilisateur connecté.



0
votes

Vous devez accéder au request.user.organisation depuis le formulaire save.

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})

Et depuis la vue:

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)


0 commentaires