2011-06-11 88 views
1

我正在編寫一個應用程序來幫助員工跟蹤正在處理的項目。django表單登錄用戶問題

表單的一部分應該允許登錄的員工單擊下拉菜單並查看他們正在處理的所有項目。這是我正在努力的部分;特別是只在下拉列表中填寫登錄用戶的項目。任何幫助或見解都非常感謝。謝謝......

models.py

class Photo(models.Model): 
    image = models.ImageField(upload_to='uploads/images/photo') 
    title = models.CharField(max_length=50) 

    def __unicode__(self): 
     return self.title 


class Employee(models.Model): 
    user = models.ForeignKey(User, unique=True) 
    photo = models.ImageField(upload_to='uploads/images') 
    department = models.ForeignKey(Department, null=True) 
    phone = PhoneNumberField("Phone") 

    def __unicode__(self): 
     return self.user.get_full_name() 


class Projects(models.Model): 
    name = models.CharField(max_length=40) 
    student = models.ForeignKey(Student) 
    photos = models.ManyToManyField(Photo, blank=True, null=True) 

forms.py

class ProjectsForm(forms.ModelForm): 
    employee = get_object_or_404(Employee, user=user) 
    employee_projects = employee.projects_set.all() 
    name = forms.ModelChoiceField(queryset=employee_projects, 
      empty_label="(Select a Project)", required=True) 


    class Meta: 
     model = Projects 
+0

你'Projects'模型沒有外鍵'Employee',順便說一句。 – Tony 2011-06-11 04:25:39

回答

1

您需要將ProjectsForm類定義的前兩行放到其初始化方法中並稍微更改它們。現在

class ProjectsForm(forms.ModelForm): 
    name = forms.ModelChoiceField(queryset=Employee.objects.all(), 
      empty_label="(Select a Project)", required=True) 

    class Meta: 
     model = Projects 

    def __init__(self, user, *args, **kwargs): 
     super(self, ProjectsForm).init(*args, **kwargs) 
     employee = get_object_or_404(Employee, user=user) 
     self.fields['name'].queryset = employee.projects_set.all() 

,一些解釋。希望有人會發現它有用。

在您原來的ProjectsForm定義中,當您的課程定義爲時,您試圖獲得員工的項目。但是,一旦你的forms.py文件被編譯了,這很少發生(例如當你改變代碼時)。此外,您當然沒有必要過濾項目所需的數據,即在該階段沒有數據對象user

取而代之的是,您每次需要在初始化時執行此操作。 Python中的初始化發生在特殊的__init__()方法中。例如,當你做這樣的事情

form = ProjectsForm(data=request.POST) 

在您看來,什麼情況是,ProjectsForm.__init__(data=request.POST)被稱爲初始化ProjectsForm成一個實例。

因此,在我們的新定義中,我們要求在實例化時將新參數(用戶)傳遞給表單。所以,你可以做這樣的事情在你看來:

form = ProjectsForm(request.user, data=request.POST) 

在新的初始化方法,首先我們調用父類的初始化方法(其中做了一些內部的Django的事情,無論如何都應該被稱爲),然後使用參數user以獲取相關員工,然後將該員工項目的查詢集分配到name字段。

對不起,如果我太冗長了。

參見:

+0

非常感謝您的洞察力,但名稱會填充所有員工姓名而不是他們的項目;我認爲init函數應該是 def __init __(self,user,* args,** kwargs): super(ProjectsForm,self).__ init __(* args,** kwargs) employee = get_object_or_404(Employee,user = user) self.fields ['name'] = forms.ModelChoiceField( queryset = employee.projects_set.all()) – 2011-06-11 21:29:07

+0

沒關係,我輸出了一個不同的字段。再次感謝你的幫助... – 2011-06-11 22:39:06