2011-06-11 89 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