Обратный просмотр таблицы, связанной с моделью профиля, связанной с моделью пользователя - PullRequest
0 голосов
/ 12 июля 2011

Я использую django.contrib.auth для аутентификации.Режим User имеет модель пользовательского профиля, которая называется Personnel.Personnel связан с другой таблицей, которая называется Company.

class Personnel(models.Model):
    """
    Model for storing the personnel information
    """
    user = models.OneToOneField(
        User
    )
    company = models.ForeignKey(
        Company, null=False, verbose_name="Company"
    )

class Company(models.Model):
    """
    Model for storing the company information.
    """
    company_name = models.CharField(
        null=False, max_length=200, verbose_name="Company Name"
    )
  • После аутентификации пользователя.Как я могу получить компанию для пользователя?Что-то вроде request.user....

  • В представлении я могу получить доступ к запросу, но если мне нужно получить доступ к переменной request в моей форме и моей модели, нужно ли мне передаватьзапросить переменную в форме / модели или есть какой-нибудь способ получить к ней доступ?Это потому, что когда я храню информацию для определенного Company, это должна быть компания, которой принадлежит Personnel.

Ответы [ 3 ]

1 голос
/ 12 июля 2011

Вы должны иметь доступ к компании через request.user.get_profile().company. См. Документацию django .

Вы не можете получить доступ к request напрямую в форме, так как форма может быть создана и где-то еще, не только в представлении, где не существует request объекта. Вы можете передать текущего пользователя в форму при его инициализации (помните, что имеет смысл передать user , а не request , поэтому вы можете использовать его и без запроса) .

class MyForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        self.user = kwargs.pop('user')
        super(MyForm, self).__init__(*args, **kwargs)

# in you view
form = MyForm(user=request.user)
0 голосов
/ 12 июля 2011

Для экземпляров модели компании вы можете получить весь персонал (для дальнейшего использования в моделях django имена должны быть единичными), используя:

company = Company.objects.get(id=some_company_id)
personnel = company.personnel_set.all()

Если у вас есть конкретный экземпляр персонала:

person = request.user.get_profile()
company = person.company

Для вашей формы.Если вашей форме нужен доступ к текущему пользователю, вам нужно будет передать ее ей.Вы делаете это путем переопределения функции init в форме

class SomeForm(forms.Form):
    def __init__(self, user, *args, **kwargs):
         super(self, SomeForm).__init__(*args, **kwargs)
         self.user = user
0 голосов
/ 12 июля 2011

Нет прямой ссылки между пользователем и компанией, поэтому вам нужно сделать request.user.personnel.company.

. Вам всегда нужно явно указывать request.Вы можете сохранить его внутри формы при инициализации и получить к нему доступ позже:

class MyForm(forms.ModelForm):
  ... fields, meta, etc ...
  def __init__(self, *args, **kwargs):
    self.request = kwargs.pop('request', None)
    super(MyForm, self).__init__(*args, **kwargs)
...