Обратный просмотр таблицы, связанной с моделью профиля, связанной с моделью пользователя
Я использую 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