5 votes

Transmettre les données de la requête Django à Forms.py

Le scénario;

Nous avons un formulaire avec des champs et à l'intérieur du formulaire il y a une combobox, elle se remplit avec des éléments.

Nous avons une location et chaque utilisateur a un TenantID donc lorsque l'utilisateur A1 (tenantid 1) appelle le formulaire de création, nous devons filtrer cette combobox pour ne filtrer que les éléments de l'utilisateur A1 en utilisant le filtrage de requête.

De même pour d'autres locataires.

Comment puis-je passer ce tenantid dynamique.

Au fait pour chaque utilisateur, le tenantid est stocké dans la classe abstraite django core USER - un nouveau champ tenantid a été ajouté. Tout conseil que je suis ouvert, merci pour votre attention.

État: Résolu !

Forms.py

class ItemForm(forms.ModelForm):
    class Meta:
        model = Items
        fields = ('id', 'item', 'start', 'end')
        widgets = {
            'start': DateTimePickerInput(format='%Y-%m-%d %H:%M'),
            'end': DateTimePickerInput(format='%Y-%m-%d %H:%M'),
        }

    def __init__(self, *args, **kwargs):
        super(ItemForm, self).__init__(*args, **kwargs)
        self.fields['item'].queryset = Items.objects.filter(tenantid=int(User.tenantid))

views.py

@login_required()
def create_item_record(request):
    if request.method == 'POST':
        form = ItemForm(request.POST)
    if request.method == 'GET':
        tenantidX = request.user.tenantid
        form = ItemForm()
    return save_item_form(request, form, 'items_create_partial.html')

6voto

GwynBleidD Points 10017

Il suffit de passer l'utilisateur de la requête à votre formulaire :

class ItemForm(forms.ModelForm):
    class Meta:
        model = Items
        fields = ('id', 'item', 'start', 'end')
        widgets = {
            'start': DateTimePickerInput(format='%Y-%m-%d %H:%M'),
            'end': DateTimePickerInput(format='%Y-%m-%d %H:%M'),
        }

    def __init__(self, user, *args, **kwargs):
        super(ItemForm, self).__init__(*args, **kwargs)
        self.fields['item'].queryset = Items.objects.filter(tenantid=int(user.tenantid))

@login_required()
def create_item_record(request):
    if request.method == 'POST':
        form = ItemForm(request.user, request.POST)
    if request.method == 'GET':
        form = ItemForm(request.user)
    return save_item_form(request, form, 'items_create_partial.html')

3voto

BCA Points 235

La meilleure et la façon la plus simple d'obtenir la requête actuelle en utilisant "django-crum" https://pypi.org/project/django-crum/.

pip install django-crum

ensuite ajoutez ceci à settings.py

# settings.py
MIDDLEWARE_CLASSES = (
 'crum.CurrentRequestUserMiddleware',
...
)

inclure la librairie

from crum import get_current_request

request = get_current_request()

Ensuite, vous pouvez accéder à la requête active avec request.user.tenantid

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X