django 在 forms.ModelForm 里怎么获得当前的登录用户?  想在 forms.ModelForm 里用当前登录用户与信息作者用户做个比较。不知道有什么办法可以在 forms.ModelForm 这里面取得当前的登录用户。 谢谢各位

views.py 里:
```
#用户编辑贴子
class Edit_Topic(UpdateView):
        model = Topic
        slug_field = 'pk'
        slug_url_kwarg = 'pk'
        form_class = EditTopicForm
        template_name = 'gqinfo/edit_topic.html'
        context_object_name = 'topic'
        def get_success_url(self):
                t = Topic.objects.get(id=self.kwargs.get('pk'))
                if t.hidden:#信息未审核,跳转到待审列表
                        return reverse("info:shenhe_list")
                else:#信息审核后直接显示
                        return reverse_lazy("info:topic_detail", kwargs={'pk':t.id})
```

forms.py 里

```
class EditTopicForm(forms.ModelForm):
        def __init__(self, *args, **kwargs):
                self.instance = kwargs.get('instance', None)
                self.request = kwargs.get('request', None)#这里取不到数据
                super(EditTopicForm, self).__init__(*args, **kwargs)



        class Meta:
                model = Topic
                #fields = "__all__"
                fields = ['title', 'infocategory', 'category', 'body', 'tags', 'ys_t']
               
        # def form_valid(self, form):
                # form.instance.created_by = self.request.user
                # return super().form_valid(form)
               
        def save(self):
                inst = super(EditTopicForm, self).save()
                print (self.request) #这里没有这个 request
                print (inst.author.is_superuser, 'dddddd') #这里显示的是信息发布者的用户。不是当前登录的用户
                return inst
               
```


在 forms.ModelForm 里怎么获得当前的登录用户?  想在 forms.ModelForm 里用当前登录用户与信息作者用户做个比较。不知道有什么办法可以在 forms.ModelForm 这里面取得当前的登录用户。 谢谢各位
举报· 160 次点击
登录 注册 站外分享
9 条回复  
volvo007 小成 2024-8-13 12:29:17
@python30 你修改信息必然用 post (或者什么别的)方法发起请求。那服务器一定可以拿到这次请求的参数,由于修改数据一般是注册用户才能做的,所以参数里面必然会有 user 信息。 这部分就是通过 self.request.user 拿到的。你的 view 函数里应该有个 request 参数呀,是个 django 的 HttpRequest 的实例
HashV2 小成 2024-8-12 10:31:31
打个断点看看上下文,valid 相关的钩子函数应该可以拿到,如果拿不到建议这块逻辑挪到 serializer 里
zonde306 小成 2024-8-11 20:40:17
可以自己写一个 middleware 捕获 request 放到 全局/模块/单例
例如我自己写的 middleware:
```python
import contextvars
import django.http

GLOBAL_REQUEST = contextvars.ContextVar("GLOBAL_REQUEST", default=None)

class GlobalRequest:
        def __init__(self, get_response):
                self.get_response = get_response
       
        def __call__(self, request):
                global GLOBAL_REQUEST
                GLOBAL_REQUEST.set(request)
                return self.get_response(request)

# 用这个获取 request 实例
def get_request() -> django.http.HttpRequest:
        return GLOBAL_REQUEST.get()

```
pililink 小成 2024-8-11 16:31:00
request.user
lybcyd 小成 2024-8-11 14:05:35
可以说一下目的吗?需要当前用户信息做什么样的事情
mylifcc 小成 2024-8-11 13:25:31
self.request.user 不就行了
sduoduo233 小成 2024-8-11 13:24:42
重写 get_form_kwargs ,把 requeest.user 加进去,然后就可以在 EditTopicForm 的__init__拿到了
(我没试过)
coolair 小成 2024-8-11 12:58:55
init 中获取不到,除非你在 view 里面显示的传。

可以在 form_valid 中使用 self.request.user 获取,只需重写这个函数就可以了。
echoless 小成 2024-8-11 12:17:22
https://docs.djangoproject.com/en/5.0/topics/auth/default/#user-objects
返回顶部