【问题标题】:Reverse looking up a table linked to the profile model linked to the User model反向查找链接到用户模型的配置文件模型的表
【发布时间】:2011-07-12 08:18:15
【问题描述】:

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

【问题讨论】:

    标签: python django request authentication django-contrib


    【解决方案1】:

    您应该可以通过request.user.get_profile().company 访问公司。请参阅django documentation

    您不能直接在表单中访问request,因为表单也可以在其他地方实例化,而不仅仅是在不存在request 对象的视图中。您可以在初始化时将当前用户传递给表单(请记住传递 user 而不是 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)
    

    【讨论】:

      【解决方案2】:

      从用户到公司没有直接链接,所以你需要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)
      

      【讨论】:

        【解决方案3】:

        对于公司模型实例,您可以使用以下方法获取所有人员(以供将来在 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-05-14
        • 1970-01-01
        • 1970-01-01
        • 2014-12-17
        • 2017-11-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多