【问题标题】:django manytomany and the modelformdjango manytomany 和 modelform
【发布时间】:2011-06-26 08:49:27
【问题描述】:

我是 django 的新手,我对 django 的 M2M 的工作原理以及它如何与 modelForm 或表单一起工作有一些疑问。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:如何为现有代理构建一个表单,以将新代理添加到他/她担任经理的区域。

谢谢,

格言

【问题讨论】:

    标签: python django django-forms django-orm


    【解决方案1】:

    问题 #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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-18
      • 2014-04-18
      • 1970-01-01
      • 2020-01-09
      • 2011-02-08
      • 1970-01-01
      • 1970-01-01
      • 2011-09-01
      相关资源
      最近更新 更多