【发布时间】:2012-03-30 06:24:11
【问题描述】:
我有以下模型:Department、Projects、Departmentprojects、Employees 和 Membership。一个部门有许多项目,项目有许多通过成员资格分配角色的员工。我正在尝试创建一个 InlineFormset,以便欧盟可以将员工的角色分配给多个项目。
我的模板呈现正确的标签和字段,但 Departmentprojects 标签和字段不显示项目的名称。它只显示“Departmentprojects 对象”。如何让表单呈现项目名称而不是“Departmentprojects 对象”?
--
浏览器中的当前模板:
Departmentproject 标签:(下拉菜单有两个选项列为“Departmentprojects 对象”) 角色:项目经理
浏览器中所需的模板:
部门项目名称1:项目经理
部门项目名称 2:其他角色
--
型号:
class Projects(models.Model):
name = models.CharField(max_length=20)
def __unicode__(self):
return self.name
class Department(models.Model):
name = models.CharField(max_length=20)
def __unicode__(self):
return self.name
class Employees(models.Model):
name = models.CharField(max_length=15)
def __unicode__(self):
return self.name
class Departmentprojects(models.Model):
department = models.ForeignKey(Department)
projects = models.ForeignKey(Projects)
members = models.ManyToManyField(Employees, through='Membership')
class Membership(models.Model):
departmentprojects = models.ForeignKey(Departmentprojects)
employees = models.ForeignKey(Employees)
role = models.CharField(max_length=20)
--
查看
def addtoprojects(request, employees_id):
e = get_object_or_404(Employees, pk=employees_id)
ProjectsInlineFormSet = inlineformset_factory(Employees, Membership, max_num=1)
if request.method == "POST":
formset = ContactInlineFormSet(request.POST, instance=e)
if formset.is_valid():
formset.save()
else:
formset = ProjectsInlineFormSet(instance=e)
return render_to_response('gcstest/contact.html', {'e': e, 'formset': formset}, context_instance=RequestContext(request))
--
模板
<form method="post" action="/assign_to_project/{{ employees.id }}/">
{% csrf_token %}
<table>
{{ formset }}
</table>
<input type="submit" value="Submit"/>
</form>
【问题讨论】:
-
我认为这里存在概念错误。
Departmentprojects模型的意义何在?您确定不只是要放置一个外键或多对多字段将项目链接到部门,并将members附加到项目吗? -
此外,作为一项规则,您确实希望以单数形式命名您的模型,就像您为
Department所做的那样。一个很好的理由是projects = models.ForeignKey(Projects)行只创建了与单个项目的关系,但读起来好像它创建了与许多项目的关系。 -
对不起,刚接触编程.. 但我想我是这样设置的,因为一个项目可以属于多个部门。 projects 表仅包含正在处理的各个项目部门的名称。
-
您可以使用
ManyToManyField允许一个项目与多个部门相关联(这将为您添加额外的数据库表)。Departmentprojects模型实际上只是使事情复杂化,这就是为什么你一开始就遇到这个问题的原因。例如,去掉这个模型也会让获取项目成员列表变得更加简单。 -
这样会更容易获得项目成员列表,但是部门内的项目成员列表呢?难道你不能将项目成员的范围限制在一个部门吗?
标签: django forms django-models many-to-many inline-formset