джанго мантоманы и модель формы - PullRequest
0 голосов
/ 13 февраля 2011

Я действительно новичок в django, и у меня есть несколько вопросов о том, как работает django M2M и как он работает с modelForm или формами. В настоящее время я работаю над приложением, которое содержит следующие модели:

class Agent(models.Model):
    user = models.ForeignKey(User)
    assigned_by = models.ForeignKey('self')
    date = models.DateField(auto_now_add=True)

    def __str__(self):
        return str(self.user)

class Region(models.Model):
    name = models.CharField(max_length=50)


# Agent to Region many-to-many
class ARM2M(models.Model):
    agent = models.ForeignKey(Agent)
    region = models.ForeignKey(Region)
    is_manager = models.BooleanField(default=False)

Ограничения: агент может находиться в нескольких регионах, и он / она может быть одним из менеджеров в любом из тех регионов, в которых он / она находится.

Вопрос № 1: есть ли способ представить такую ​​логику с помощью функции «многие ко многим» в модели django?

-end-оф-вопрос # 1

Итак, у меня есть эта AgentForm для менеджера агентов, чтобы добавить нового агента в его / ее регионах. Но я знаю, что эта форма не работает: потому что в MultipleChoiceField у меня нет возможности получить текущий зарегистрированный агент для представления доступных регионов. Другими словами, я застрял.

class AgentForm(forms.Form):
    agent = forms.IntegerField(widget=forms.HiddenInput()) 
    regions = forms.MultipleChoiceField(choices=RAM2M.objects.filter(agent=agent, is_manager=True))

    def save(self):
        agent_id = self.cleaned_data['assigned_by']
        agent = Agent.objects.get(pk=int(agent_id))
        self.instance.assigned_by = agent
        super(AgentForm, self).save()

    class Meta:
        model=Agent
        exclude = ('assigned_by')

Вопрос № 2: Как создать форму для существующего агента, чтобы добавить нового агента в регионы, где он / она является менеджером.

Спасибо

Максим

1 Ответ

0 голосов
/ 13 февраля 2011

Вопрос # 1: вы можете указать промежуточную модель для отношения M2M, используя аргумент through:

class Agent(models.Model):
    ...
    regions = models.ManyToManyField(Region, through='ARM2M')

(см. http://docs.djangoproject.com/en/dev/topics/db/models/#intermediary-manytomany)

По вопросу № 2, еслиподумайте, что ответ на этот вопрос вам нужен: Создание поля динамического выбора

...