django формы вошли в проблему пользователя - PullRequest
1 голос
/ 11 июня 2011

Я пишу приложение, чтобы помочь сотрудникам отслеживать проекты, над которыми работаем.

Часть формы должна позволять вошедшим в систему сотрудникам нажимать на раскрывающийся список и видеть все проекты, над которыми они работают. Это часть, с которой я борюсь; в частности, получать только те проекты, которые вошли в систему, в выпадающем списке. Любая помощь или понимание очень ценится. Благодаря ......

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

Ответы [ 2 ]

1 голос
/ 11 июня 2011

Вам нужно поместить первые две строки из определения класса 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 голосов
/ 11 июня 2011

Почему бы не иметь поле «многие ко многим» в модели «Сотрудник», в котором указаны все проекты, над которыми сотрудник может работать?сделать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...