django manytomany和modelform

时间:2011-02-13 07:50:41

标签: python django django-forms django-orm

我是django的新手,我对django的M2M如何工作以及它如何与modelForm或forms一起工作有一些疑问。我目前正在处理包含以下模型的应用程序:

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模型中使用多对多功能来呈现这样的逻辑?

末端-的-问题#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 :(得分:0)

问题#1:您可以使用through参数为M2M关系指定中间模型:

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

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

关于问题#2,如果认为这有你想要的答案:Creating a dynamic choice field