Django 多对多与 ModelForm

0 投票
1 回答
897 浏览
提问于 2025-04-16 11:44

我刚接触django,有一些关于django中多对多(M2M)关系的问题,还有它是如何与modelForm或forms.Form一起工作的。我现在正在开发一个包含以下模型的应用:

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:我该如何构建一个表单,让现有的代理可以在他/她是经理的地区添加新代理。

谢谢,

Maxim

1 个回答

0

问题 #1:你可以通过 through 参数来指定一个中间模型,用于多对多关系。

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

(详情请查看 http://docs.djangoproject.com/en/dev/topics/db/models/#intermediary-manytomany

关于问题 #2,我觉得这里有你想要的答案:创建动态选择字段

撰写回答