2011-07-12 65 views
0

我正在使用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所屬的公司。

回答

1

您應該能夠通過request.user.get_profile().company訪問公司的初始化功能做到這一點。請參閱django documentation

您不能直接在表單中訪問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) 
0

有沒有用戶直接鏈接到公司,所以你需要做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) 
0

對於公司模式情況下,你可以通過使用獲得的所有人員(在Django模型備查名稱應爲單數):

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

如果你有一個特別的人事實例:

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

爲了您的形式。如果你的表單需要訪問當前用戶,那麼你需要將它傳遞給它。您可以通過覆蓋表單

class SomeForm(forms.Form): 
    def __init__(self, user, *args, **kwargs): 
     super(self, SomeForm).__init__(*args, **kwargs) 
     self.user = user 
+0

最好不要改變表單實例的簽名。 –