Как отфильтровать значения в форме Django, используя ModelForm? - PullRequest
15 голосов
/ 10 июня 2010

Я пытаюсь использовать ModelForm для добавления моих данных.Он работает хорошо, за исключением того, что в раскрывающемся списке ForeignKey отображаются все значения, и я хочу, чтобы он отображал только те значения, которые имеют отношение к вошедшему в систему пользователю.

Вот моя модель для ExcludedDate, запись, которую я хочудобавить:

class ExcludedDate(models.Model):
    date = models.DateTimeField()
    reason = models.CharField(max_length=50)
    user = models.ForeignKey(User)
    category = models.ForeignKey(Category)
    recurring = models.ForeignKey(RecurringExclusion)

    def __unicode__(self):
        return self.reason

Вот модель для категории, которая представляет собой таблицу, содержащую отношение, которое я хотел бы ограничить пользователем:

class Category(models.Model):
    name = models.CharField(max_length=50)
    user = models.ForeignKey(User, unique=False)

    def __unicode__(self):
        return self.name

И, наконец,Код формы:

class ExcludedDateForm(ModelForm):

    class Meta:
        model = models.ExcludedDate
        exclude = ('user', 'recurring',)

Как заставить форму отображать только подмножество категорий, где category.user равен зарегистрированному пользователю?

Ответы [ 3 ]

21 голосов
/ 10 июня 2010

Вы можете настроить свою форму в init

class ExcludedDateForm(ModelForm):
    class Meta:
        model = models.ExcludedDate
        exclude = ('user', 'recurring',)
    def __init__(self, user=None, **kwargs):
        super(ExcludedDateForm, self).__init__(**kwargs)
        if user:
            self.fields['category'].queryset = models.Category.objects.filter(user=user)

И в представлениях, при создании формы, помимо стандартных параметров формы, вы также указываете текущего пользователя:

form = ExcludedDateForm(user=request.user)
0 голосов
/ 29 ноября 2014

Я знаю, что это старо;но это один из первых результатов поиска Google, поэтому я подумал, что я добавлю, как я нашел, чтобы сделать это.

class CustomModelFilter(forms.ModelChoiceField):
    def label_from_instance(self, obj):
        return "%s %s" % (obj.column1, obj.column2)

class CustomForm(ModelForm):
    model_to_filter = CustomModelFilter(queryset=CustomModel.objects.filter(active=1))

    class Meta:
        model = CustomModel
        fields = ['model_to_filter', 'field1', 'field2']

Где 'model_to_filter' является ForiegnKey модели "CustomModel"

Почему мне нравится этот метод: в «CustomModelFilter» вы также можете изменить способ отображения объекта Model по умолчанию в создаваемом ChoiceField, как я это делал выше.

0 голосов
/ 10 июня 2010

Вот пример:

models.py

class someData(models.Model):
    name = models.CharField(max_length=100,verbose_name="some value")

class testKey(models.Model):
    name = models.CharField(max_length=100,verbose_name="some value")
    tst = models.ForeignKey(someData)

class testForm(forms.ModelForm):
    class Meta:
        model = testKey

views.py

...
....
....
    mform = testForm()
    mform.fields["tst"] = models.forms.ModelMultipleChoiceField(queryset=someData.objects.filter(name__icontains="1"))
...
...

Или вы можете попробовать что-то вроде этого:

class testForm(forms.ModelForm):
    class Meta:
        model = testKey

def __init__(self,*args,**kwargs):
    super (testForm,self ).__init__(*args,**kwargs)
    self.fields['tst'].queryset = someData.objects.filter(name__icontains="1")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...