反向查找链接到链接到用户模型的配置文件模型的表

时间:2011-07-12 08:18:15

标签: python django request authentication django-contrib

我正在使用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 个答案:

答案 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