5 Stimmen

Begrenzen Sie die Auswahl eines Feldes auf der Grundlage eines Benutzers

Ich möchte, dass das Formular nur die Konten des aktuellen Benutzers im ChoiceField anzeigt. Ich habe versucht, das Folgende zu tun, aber es funktioniert nicht.

Edit: Sorry, ich habe vergessen, das "if kwargs" zu erwähnen, das ich hinzugefügt habe, weil die TransForm() keine Felder anzeigt. Ich denke, das ist falsch, aber ich weiß nicht, einen anderen Weg.

views.py:

def in(request, account): 
    if request.method == 'POST':
        form = TransForm(request.user, data=request.POST)
        if form.is_valid():
            ...

    else:
        form = TransForm()

    context = {
          'TranForm': form,
    }
    return render_to_response(
        'cashflow/in.html',
        context,
        context_instance = RequestContext(request),
)

forms.py:

class TransForm(ModelForm):
    class Meta:
        model = Trans

    def __init__(self, *args, **kwargs):
        super(TransForm, self).__init__(*args, **kwargs)
        if kwargs:
            self.fields['account'].queryset = Account.objects.filter(user=args[0])

1 Stimmen

Was bedeutet "funktioniert nicht"? Haben Sie keine Wahlmöglichkeiten? Haben Sie zu viele?

0 Stimmen

Und versuchen Sie .choices anstelle von .queryset, da das Queryset zu diesem Zeitpunkt bereits ausgewertet worden sein kann

0 Stimmen

Ich meine, ich bekomme alle Konten, nicht nur die Benutzerkonten.

6voto

Bernhard Vallant Punkte 46005

Sie müssen auch das Formular korrekt initialisieren, wenn die Anfrage KEINE Post-Anfrage ist:

if request.method == 'POST':
    form = TransForm(user=request.user, data=request.POST)
    if form.is_valid():
        ...

else:
    form = TransForm(user=request.user)
 ...

und außerdem würde ich empfehlen, das neue Argument beim Aufruf des Konstruktors der Oberklasse zu entfernen:

class TransForm(ModelForm):
    class Meta:
        model = Trans

    def __init__(self, *args, **kwargs):
        user = kwargs.pop('user')
        super(TransForm, self).__init__(*args, **kwargs)
        self.fields['account'].queryset = Account.objects.filter(user=user)

0 Stimmen

Danke, die Zeile user = kwargs.pop('user') war die Lösung für mein Problem.

2voto

rz. Punkte 19415

Versuchen Sie dies in forms.py:

class TransForm(ModelForm):
    class Meta:
        model = Trans

    def __init__(self, user, *args, **kwargs):
        super(TransForm, self).__init__(*args, **kwargs)    
        qs = Account.objects.filter(user=user)
        self.fields['account'] = ModelChoiceField(queryset=qs)

Ich gehe davon aus, dass Sie Formulare importiert haben als from django.forms import * .

Ich bin mir nicht sicher, was genau Ihr Problem verursacht, aber ich vermute zwei Dinge (möglicherweise sogar beides):

  1. Sie rufen den Konstruktor der Superklasse mit einem unerwarteten Argument (user) auf.
  2. Die Auswahlmöglichkeiten für ein ModelChoiceField werden festgelegt, wenn der Konstruktor des Feldes ausgeführt wird, der als Teil des Konstruktors der Superklasse ausgeführt wird. In diesem Fall hat das nachträgliche Einstellen des Querysets keine Auswirkungen auf die Auswahlmöglichkeiten.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X