0

我正在django.contrib.auth使用身份验证。该User模式有一个名为 的自定义配置文件模型PersonnelPersonnel链接到另一个名为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所属的公司。

4

3 回答 3

1

您应该能够通过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)
于 2011-07-12T08:32:57.973 回答
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)
于 2011-07-12T08:29:23.473 回答
0

对于公司模型实例,您可以使用以下方法获取所有人员(以供将来在 django 模型中参考,名称应为单数):

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

如果您有特定的 Personnel 实例:

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
于 2011-07-12T08:30:12.880 回答