Нужна помощь с Django ModelForm: Как отфильтровать ForeignKey / ManyToManyField? - PullRequest
5 голосов
/ 07 июня 2009

Хорошо, мне трудно объяснить это, дайте мне знать, если я должен сообщить вам более подробную информацию.

Мой URL выглядит так: http://domain.com/>/
Каждый <category> может иметь одну или несколько подкатегорий.

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

В моем текущем жестко закодированном решении я имею в своем представлении категории:

s = Category.objects.filter(parents__exact=c.id)  

, что шаблон формы проходит через и печатает поле выбора (см. Код модели ниже)

Я предполагаю, что мне нужен ModelFormSet с init , который отфильтровывает категории, но я не могу найти, как это сделать в документации.

Рассматривал Как отфильтровать выборки ForeignKey в Django ModelForm? , но я не могу заставить его работать должным образом.

Мои модели

# The model that the Form should implement
class Incoming(models.Model):
    cat_id = models.ForeignKey(Category)
    zipcode = models.PositiveIntegerField()
    name = models.CharField(max_length=200)
    email = models.EmailField()
    telephone = models.CharField(max_length=18)
    submit_date = models.DateTimeField(auto_now_add=True)
    approved = models.BooleanField(default=False)

# The categories, each category can have none or many parent categories
class Category(models.Model):
    name = models.CharField(max_length=200, db_index=True)
    slug = models.SlugField()
    parents = models.ManyToManyField('self',symmetrical=False, blank=True, null=True)

    def __unicode__(self):
        return self.name

Моя форма

class IncomingForm(ModelForm):
    class Meta:
        model = Incoming

Ответы [ 2 ]

9 голосов
/ 07 июня 2009

Как вы говорите, вам нужен класс модели с пользовательским __init__:

class IncomingForm(ModelForm):
    class Meta:
        model = Incoming

    def __init__(self, *args, **kwargs):
        super(IncomingForm, self).__init__(*args, **kwargs)
        if self.instance:
            self.fields['parents'].queryset = Category.objects.filter(
                                              parents__exact=instance.id)
6 голосов
/ 15 июля 2009

Я бы отредактировал ответ Daniel Rosemans и проголосовал за него победителем, но так как я не могу его отредактировать, я отправлю правильный ответ здесь:

class IncomingForm(ModelForm):
    class Meta:
        model = Incoming

    def __init__(self, *args, **kwargs):
        super(IncomingForm, self).__init__(*args, **kwargs)
        if self.instance:
            self.fields['cat_id'].queryset = Category.objects.filter(
                    parents__exact=self.instance.id)

Разница составляет self.fields ['cat_id'] (правильно) против self.fields ['parent'] (неправильно, мы оба допустили одну и ту же ошибку)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...