2012-03-14 101 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