2012-03-14 52 views
4

欧盟可以使用此表单来选择他们为任何给定项目所扮演的角色(项目经理,开发人员等)。我想限制项目字段选项仅限于员工部门中的选项。现在,欧盟可以选择任何部门的项目(但不是部门,我已经完全排除)我该怎么做?查询集=布拉布拉不工作..DJANGO:如何限制inlineformset查询集

机型:

class Department(models.Model): 
    name = models.CharField(max_length=20) 
    def __unicode__(self): 
     return self.name 

class Employee(models.Model): 
    fname = models.CharField(max_length=15) 
    department = models.ForeignKey(Department) 
    def __unicode__(self): 
     return self.fname 

class Projecttype(models.Model): 
    name = models.CharField(max_length=20) 
    def __unicode__(self): 
     return self.name 

class Project(models.Model): 
    projecttype = models.ForeignKey(Projecttype) 
    department = models.ForeignKey(Department) 
    members = models.ManyToManyField(Employee, through='Membership') 
    def __unicode__(self): 
     return "%s > %s" % (self.department, self.projecttype) 

class Role(models.Model): 
    name = models.CharField(max_length=20) 
    def __unicode__(self): 
     return self.name 

class Membership(models.Model): 
    project = models.ForeignKey(Project, null=True) 
    department = models.ForeignKey(Department) 
    employee = models.ForeignKey(Employee) 
    role = models.ManyToManyField(Role, blank=True, null=True) 
    class Meta: 
     unique_together = (("project", "employee",),) 

VIEW:

def employee_edit(request, employee_id): 
    i = get_object_or_404(Employee, pk=employee_id) 
    EmployeeInlineFormSet = inlineformset_factory(Employee, Membership, extra=1, exclude=('department',), queryset=Membership.objects.filter(department=i.department)) 
    if request.method == "POST": 
     f = EmployeeInlineFormSet(request.POST, instance=i) 
     if f.is_valid(): 
      f.save() 
    else: 
     f = EmployeeInlineFormSet(instance=i) 
    return render_to_response('testdb/edit.html', {'item': i, 'formset': f, }, context_instance=RequestContext(request)) 

JSON:MANAGE.PY DUMPDATA TESTDB --INDENT = 4

[ 
    { 
     "pk": 1, 
     "model": "testdb.department", 
     "fields": { 
      "name": "IT Department" 
     } 
    }, 
    { 
     "pk": 2, 
     "model": "testdb.department", 
     "fields": { 
      "name": "Operations Department" 
     } 
    }, 
    { 
     "pk": 1, 
     "model": "testdb.employee", 
     "fields": { 
      “department”: 1, 
      "fname": "Alice" 
     } 
    }, 
    { 
     "pk": 2, 
     "model": "testdb.employee", 
     "fields": { 
      “department”: 2, 
      "fname": "Eve" 
     } 
    }, 
    { 
     "pk": 3, 
     "model": "testdb.employee", 
     "fields": { 
      “department”: 1, 
      "fname": "Bob" 
     } 
    }, 
    { 
     "pk": 1, 
     "model": "testdb.projecttype", 
     "fields": { 
      "name": "PROCESS IMPROVEMENT" 
     } 
    }, 
    { 
     "pk": 2, 
     "model": "testdb.projecttype", 
     "fields": { 
      "name": "DATA CLEANUP" 
     } 
    }, 
    { 
     "pk": 1, 
     "model": "testdb.project", 
     "fields": { 
      “projecttype”: 1, 
      “department”: 1 
     } 
    }, 
    { 
     "pk": 2, 
     "model": "testdb.project", 
     "fields": { 
      “projecttype”: 1, 
      “department”: 2 
     } 
    }, 
    { 
     "pk": 3, 
     "model": "testdb.project", 
     "fields": { 
      “projecttype”: 2, 
      “department”: 1 
     } 
    }, 
    { 
     "pk": 1, 
     "model": "testdb.role", 
     "fields": { 
      "name": "Project Manager" 
     } 
    }, 
    { 
     "pk": 2, 
     "model": "testdb.role", 
     "fields": { 
      "name": "Analyst" 
     } 
    }, 
    { 
     "pk": 1, 
     "model": "testdb.membership", 
     "fields": { 
      "employee": 1, 
      “department”: 1, 
      “project”: 1, 
      "role": [ 
       1, 
       2 
      ] 
     } 
    }, 
    { 
     "pk": 2, 
     "model": "testdb.membership", 
     "fields": { 
      "employee": 2, 
      “department”: 2, 
      “project”: 2, 
      "role": [ 
       1 
      ] 
     } 
    }, 
    { 
     "pk": 3, 
     "model": "testdb.membership", 
     "fields": { 
      "employee": 3, 
      “department”: 1, 
      “project”: 1, 
      "role": [ 
       1 
      ] 
     } 
    } 
] 
+0

也许你能做到这一点的看法,因为[这里](HTTP类似的东西://计算器。 com/questions/5329586/django-modelchoicefield-filtering-query-set-and-setting-default-value-as-an-obj)(Yuji的第二个解决方案:你可能会探索EmployeeInlineFormSet的属性并找到你需要的) – Arthur 2012-03-14 23:49:35

回答

6

在这点,您正在创建formset类,请勿在此传递查询集:

EmployeeInlineFormSet = inlineformset_factory(Employee, Membership, extra=1, exclude=('department',)) 

实例化formsete时传递查询集:

f = EmployeeInlineFormSet(instance=i, queryset=Membership.objects.filter(department=i.department)) 

如:

def employee_edit(request, employee_id): 
    i = get_object_or_404(Employee, pk=employee_id) 
    queryset=Membership.objects.filter(department=i.department) 
    EmployeeInlineFormSet = inlineformset_factory(Employee, Membership, extra=1, exclude=('department',)) 
    if request.method == "POST": 
     f = EmployeeInlineFormSet(request.POST, instance=i, queryset=queryset) 
     if f.is_valid(): 
      f.save() 
    else: 
     f = EmployeeInlineFormSet(instance=i, queryset=queryset) 
    return render_to_response('testdb/edit.html', {'item': i, 'formset': f, }, context_instance=RequestContext(request)) 
+0

对我来说是有意义的,看起来很干净,它不起作用。其他部门项目显示... – thedeepfield 2012-03-15 16:30:18

+0

你可以发布一些json的装置,以便我可以真正测试它吗?另外我想到了另一种解决方案:使用常规formset而不是inlineformset,因为您正在制作查询集。然后,在保存之前手动设置员工。 – jpic 2012-03-15 16:32:15

+0

虽然这对我来说很有意义并且看上去很干净,但它不起作用......其他部门项目显示出来......在shell print queryset中返回正确的成员资格对象,但在打印f中,仍然可以将所有membership.project选项(其他部门项目)。对不起..编程新手..什么是JSON?我想过使用一个普通的formset,但我认为inlineformset被用于这个目的? – thedeepfield 2012-03-15 16:42:56