Django 1.3 CreateView, ModelForm и фильтрация полей по запросу. - PullRequest
3 голосов
/ 31 июля 2011

Я пытаюсь отфильтровать поле в ModelForm.Я делю на подклассы общий CreateView для моего представления.Я нашел много ссылок на мою проблему в Интернете, но решения, похоже, не работают (по крайней мере, для меня) с представлениями на основе классов в Django 1.3.

Вот мои модели:

#models.py

class Subscriber(models.Model):

    user = models.ForeignKey(User)
    subscriber_list = models.ManyToManyField('SubscriberList')
    ....

class SubscriberList(models.Model):

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

Вот мой взгляд:

#views.py

class SubscriberCreateView(AuthCreateView):
    model = Subscriber
    template_name = "forms/app.html"
    form_class = SubscriberForm
    success_url = "/app/subscribers/"

    def form_valid(self, form):
        self.object = form.save(commit=False)
        self.object.user = self.request.user
        return super(SubscriberCreateView, self).form_valid(form) 

Вот моя оригинальная форма для добавления подписчика без фильтра:

#forms.py

class SubscriberForm(ModelForm):

    class Meta:
        model = Subscriber
        exclude = ('user', 'facebook_id', 'twitter_id')

Вот моя измененная форма, пытающаясяфильтр, но не работает:

#forms.py

class SubscriberForm(ModelForm):

    class Meta:
        model = Subscriber
        exclude = ('user', 'facebook_id', 'twitter_id')

    def __init__(self, user, **kwargs):
        super(SubscriberForm, self).__init__(**kwargs)
        self.fields['subscriber_list'].queryset = SubscriberList.objects.filter(user=user)

Если я изменю эту измененную форму следующим образом:

def __init__(self, user=None, **kwargs)

Это работает - это не приносит мне списки подписчиков,Но в любом случае, когда я пытаюсь передать запрос пользователю, я всегда получаю имя «запрос» или имя «я», не определенная ошибка.

Итак, как я могу изменить свой код для фильтрации subscriber_list с помощью request.userи все еще использую CreateView в Django 1.3.

1 Ответ

14 голосов
/ 29 августа 2011

Я вижу, что вы публиковали этот вопрос в разных местах ... и я обнаружил, что это потому, что я пытался понять то же самое.Я думаю Я только что заработал, и вот что я сделал.Я переписал get_form () из FormMixin, чтобы отфильтровать определенный набор полей формы запроса:

class MyCreateView(CreateView):

    def get_form(self, form_class):
        form = super(MyCreateView,self).get_form(form_class) #instantiate using parent
        form.fields['my_list'].queryset = MyObject.objects.filter(user=self.request.user)
        return form
...