Представления на основе классов Django-фильтр queryset и сохранить его


У меня есть две модели, названные спонсор и событие, и они примерно такие:

class Sponsor(models.Model):

    name = models.CharField(max_length=200)
    user = models.ForeignKey(User)


class Event(models.Model):

    name = models.CharField(max_length=200)
    sponsor = models.ForeignKey(Sponsor)

Затем, я использую представления на основе классов, чтобы обновить мой объект, и что-то вроде этого:

class EventUpdate(UpdateView):
    model = Event
    form_class = EventForm
    success_url = reverse_lazy('dashboard_events')

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

Пока все в порядке! Если я не изменяю свою форму событий, мой UpdateView работает довольно хорошо. Единственная проблема заключается в том, что я должен изменить свою форму и отфильтровать свой "спонсор" queryset, прежде чем отрисовать его! Это потому, что пользователь может видеть только "спонсоров", которые он создал.

Итак, вот что Я пытаюсь достичь:

class EventForm(ModelForm):    
...
    def __init__(self, *args, **kwargs):
        self.user = kwargs.pop('user')
        super(EventForm, self).__init__(*args, **kwargs)
        choices = Sponsor.objects.filter(user=self.user).values_list('pk', 'name')
        self.fields['sponsor'] = forms.ChoiceField(choices=choices)

Мой взгляд перерисовывается правильно, только спонсоры, которые создал пользователь, но, когда я пытаюсь сохранить, я получаю эту ошибку:

"не удается назначить" u'2'": "Событие.спонсор "должен быть экземпляром" спонсор"."

Что мне делать? Я понятия не имею, как это решить... Следую ли я здесь правильной логике? Спасибо!

1   2   2016-05-03 01:27:29

1 ответ:

Вы на правильном пути. Попробуйте что-нибудь вроде этого:

class EventForm(ModelForm):    
...
    def __init__(self, *args, **kwargs):
        self.user = kwargs.pop('user')
        super(EventForm, self).__init__(*args, **kwargs)
        self.fields['sponsor'].queryset = Sponsor.objects.filter(user=self.user)