【问题标题】:How do get request.user in django models.py or forms.py. Is it possible?如何在 django models.py 或 forms.py 中获取 request.user。可能吗?
【发布时间】:2021-07-22 18:11:32
【问题描述】:

我想过滤一个 ForeignKey 对象。如果可能的话,我想在 Django models.py 中做一些检查,并且需要获取登录用户,比如在 views.py 中使用的 request.user。

如果满足如下条件,我想将用户名附加到此返回语句:

class Store(models.Model):
    item_name = models.CharField(max_length=120, default='', blank=True, null=True)
    created_by = models.CharField(max_length=15, default='', blank=True, null=True)

    
    def __str__(self):
        item_user = self.item_name + ' - ' + self.created_by
        if request.user in item_user:
            return item_user
        else:
            return self.item_name

【问题讨论】:

  • 。模型应该是request unaware。事实上,甚至没有说修改是通过 Web 端点发生的,例如管理命令不使用 Django 用户运行。
  • 感谢您帮助停止关注不可能的存档方式。它帮助我开始寻找另一种方法并最终得到解决方案。如果有人需要,我会在这里发布。再次感谢@WillemVanOnsem

标签: django django-models django-rest-framework


【解决方案1】:

最后,我得到了解决方案,我将它发布在这里,供任何需要它的人使用。从@willemVanOnsem 的评论中,我专注于以另一种方式解决它,而不是在模型中进行。这是我解决它的方法: 我想传递创建商店项目的人的用户名,以便在从另一个模型中选择这些对象时只显示他们创建的项目: 所以我用表单来过滤和显示需要的对象。

以下是型号:

模型一:

class ModelOne(models.Model):
    name = models.CharField(max_length=120, default='', blank=True, null=True)
    line_one = models.ForeignKey(Store, blank=True, null=True, related_name='line_one')
    phone_number = models.CharField(max_length=20, default='', blank=True, null=True)

模型二:

class ModelTwo(models.Model):
    item_name = models.CharField(max_length=120, default='', blank=True, null=True)
    created_by = models.CharField(max_length=15, default='', blank=True, null=True)

    def __unicode__(self):
        return self.item_name

下面是带有所需过滤器的表单:

class FormOne(forms.ModelForm):
    class Meta:
        model = ModelOne
        fields = [
                'name',
                'phone_number',
                'line_one'
                ]

    def __init__(self, user, *args, **kwargs):
        super(FormOne, self).__init__(*args, **kwargs)
        self.fields['line_one'].queryset = ModelTwo.objects.filter(created_by = user)

现在我通过视图传递用户名:

def create(request):
    user = request.user
    form = FormOne(user, request.POST or None)
    queryset = ModelOne.objects.all()
    if form.is_valid():
        form.save()
    context = {
        "form": form,
        "queryset": queryset,
    }
    return render(request, "entry.html", context)

【讨论】:

    猜你喜欢
    • 2018-05-29
    • 1970-01-01
    • 2021-09-28
    • 1970-01-01
    • 2013-11-17
    • 2015-11-26
    • 1970-01-01
    • 2011-05-04
    • 1970-01-01
    相关资源
    最近更新 更多