Frage

Mein Ziel ist es also, einen Modellchoicefield -Queryset in meinem Modelform zu filtern, um nur Orte aufzunehmen, die der Benutzer erstellt hat.

Mein Modelform ist einfach:

class PlaceEventForm(models.ModelForm):
    class Meta:
        model = Event

Ich möchte so etwas hinzufügen wie:

def __init__(self, *args, **kwargs):
    super(PlaceEventForm, self).__init__(*args, **kwargs)
    self.fields['place'].queryset = Place.objects.filter(created_by=request.user)

Ich kann jedoch keinen Weg finden, um auf die Anfrage im Modelform zuzugreifen.

Meine Ansicht ist wie so:

class PlaceEventFormView(CreateView):
    form_class = PlaceEventForm
    template_name = 'events/event_create.html'

    @method_decorator(login_required)
    def dispatch(self, *args, **kwargs):
        return super(PlaceEventFormView, self).dispatch(*args, **kwargs)

Ich bin mir nicht sicher, ob dies überhaupt nahe an dem liegt, was ich tun sollte, aber ich habe es versucht:

def get_form_kwargs(self):
    kwargs = super(PlaceEventFormView, self).get_form_kwargs()
    kwargs.update({'place_user': self.request.user})
    return kwargs

Aber ich habe den Fehler bekommen: drin() bekommen ein unerwartetes Keyword -Argument 'Place_User'

Irgendwelche Ideen zu diesem? Oder kann jemand einen Weg vorstellen, mein ModelChocefield in der Ansicht zu filtern, ohne meine Anfrage an den Modelform weitergeben zu müssen?

War es hilfreich?

Lösung

Sie müssen Pop Key user aus kwargs in PlaceEventForm.__init__() Methode, um zu verhindern, dass es zuging ModelForm.__init__() Methode:

Ansichten.Py:

class PlaceEventFormView(CreateView):
    form_class = PlaceEventForm
    template_name = 'events/event_create.html'

    @method_decorator(login_required)
    def dispatch(self, *args, **kwargs):
        return super(PlaceEventFormView, self).dispatch(*args, **kwargs)

    def get_form_kwargs(self):
        kwargs = super(PlaceEventFormView, self).get_form_kwargs()
        kwargs.update({'place_user': self.request.user})
        return kwargs

forms.py:

class PlaceEventForm(models.ModelForm):
    class Meta:
        model = Event

    def __init__(self, *args, **kwargs):
        user = kwargs.pop('place_user')
        # now kwargs doesn't contain 'place_user', so we can safely pass it to the base class method
        super(PlaceEventForm, self).__init__(*args, **kwargs)
        self.fields['place'].queryset = Place.objects.filter(created_by=user)

Andere Tipps

Ich bin auf einem iPhone, aber mach das:

def get_form(self, form_class):
     form = super(MyView, self).get_form(form_class)
     form.fields['place'].querset = Place....
     return form

Wow das war schwer! Keine Unterstützung bei der Unbehagen!

Um die Antwort von Yujis Antwort auf Django 1.10+ (einschließlich Django 2.0+) zu aktualisieren, finden Sie im folgenden Beispiel (Beachten Sie die aktualisierte Methodensignatur). Yujis empfohlener Ansatz hält den QuerySet zusammen mit der anderen Geschäftslogik in der Sicht und hilft, alle Form der Form zu erhalten models.ModelForm Sauber und unkompliziert.

def get_form(self, form_class=None):
    if form_class is None:
        form_class = self.get_form_class()
    form = super(MyView, self).get_form()
    form.fields['place'].queryset = Place.objects.filter(created_by=self.request.user)
    return form

Kürzer:

def get_form(self, form_class=None):
    form = super(MyView, self).get_form(form_class)
    form.fields['place'].queryset = Place.objects.filter(created_by=self.request.user)
    return form
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top