Обратный просмотр таблицы, связанной с моделью профиля, связанной с моделью пользователя

Я использую 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 ответа

Решение

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

Вы не можете получить доступ request непосредственно в форме, так как форма может создаваться и где-то еще, не только в представлении, где нет 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)

Там нет прямой ссылки от пользователя к компании, поэтому вам нужно сделать 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)

Для экземпляров модели компании вы можете получить весь персонал (для дальнейшего использования в моделях 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
Другие вопросы по тегам