Django 多对多与 ModelForm
我刚接触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,我觉得这里有你想要的答案:创建动态选择字段