Как я могу ограничить доступные варианты выбора поля внешнего ключа в наборе моделей django? - PullRequest
1 голос
/ 16 ноября 2009

Применение: Это система предложений семинара для конференции. Пользователь может создавать докладчиков и семинары и связывать их вместе. Каждый пользователь должен иметь доступ только к тем докладчикам и семинарам, которые он / она создал / владеет.

# Models:

class Workshop(models.Model):
    name = models.CharField(max_length=140, db_index=True)
    presenters = models.ManyToManyField("Presenter", through="WorkshopPresenter")
    owner = models.ForeignKey(User)

class Presenter(models.Model):
    name = models.CharField(max_length=140, db_index=True)
    owner = models.ForeignKey(User)

class WorkshopPresenter(models.Model):
    workshop = models.ForeignKey("Workshop")
    presenter = models.ForeignKey("Presenter")
    cardinality = models.IntegerField()

Чтобы связать докладчиков с семинарами, пользователь направляется на специальную страницу семинара, содержащую набор моделей для WorkshopPresenter. Семинар и количество элементов задаются представлением после заполнения набора форм, поэтому пользователь видит только список раскрывающихся списков с возможными именами докладчиков. Изображение страницы ассоциации

Вопрос : Как я могу сделать так, чтобы раскрывающиеся списки докладчиков на этой странице ассоциации содержали только докладчиков, принадлежащих текущему пользователю? Выпадающие списки должны содержать только результаты Presenter.objects.filter(owner__exact=request.user). В настоящее время они содержат всех докладчиков.

# View snippet that creates the formset:

workshop = Workshop.objects.filter(owner__exact=request.user).get(id=workshop_id)

MyWorkshopPresenterFormSet = modelformset_factory(WorkshopPresenter, 
                                                  formset=WorkshopPresenterFormSet, 
                                                  extra=5, 
                                                  exclude = ("workshop","cardinality"))
formset = MyWorkshopPresenterFormSet(request.POST or None,
                                     queryset=workshop.workshoppresenter_set.all())

WorkshopPresenterFormSet просто расширяет BaseModelFormSet и выполняет некоторую пользовательскую проверку, ничего особенного.

Я видел некоторые решения, которые работают для обычных форм, но ничего не работает с наборами моделей.

1 Ответ

0 голосов
/ 16 ноября 2009

Вы можете динамически изменять набор запросов в форме, используя функциональные методы (карри), замыкания или обратные вызовы. См. Все три метода в первых трех ответах на « передача пользовательских параметров формы в набор форм

Также см. Пост Джеймса Беннетта " Итак, вам нужна динамическая форма " для хорошего подробного обсуждения метода замыкания.

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