【问题标题】:DJANGO: How to render model object name in form instead of literal "model object"?DJANGO:如何以形式呈现模型对象名称而不是文字“模型对象”?
【发布时间】: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


【解决方案1】:

__unicode__ 方法添加到您的Departmentprojects 模型,例如

class Departmentprojects(models.Model):
    department = models.ForeignKey(Department)
    projects = models.ForeignKey(Projects)
    members = models.ManyToManyField(Employees, through='Membership')

    def __unicode__(self):
        return "%s > %s" % (self.department, self.projects)

【讨论】:

  • 为什么不能只添加“return self.programs”?当我这样做时,我收到一条错误消息:渲染时捕获 TypeError:强制转换为 Unicode:需要字符串或缓冲区,找到项目“。标签仍然显示 Departmentprojects。我怎样才能只使用项目名称作为标签并迭代表单对于每个项目,而不是有下拉菜单?(如在浏览器中的所需模板中)?
猜你喜欢
  • 2020-12-18
  • 1970-01-01
  • 2011-09-28
  • 1970-01-01
  • 2012-08-30
  • 1970-01-01
  • 1970-01-01
  • 2014-12-23
  • 2019-09-25
相关资源
最近更新 更多