我正在使用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
所属的公司。
答案 0 :(得分: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)
答案 1 :(得分: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)
答案 2 :(得分:0)
对于公司模型实例,您可以使用以下方式获取所有人员(以便在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