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 这里面取得当前的登录用户。 谢谢各位
3
coolair 132 天前
init 中获取不到,除非你在 view 里面显示的传。
可以在 form_valid 中使用 self.request.user 获取,只需重写这个函数就可以了。 |
5
sduoduo233 132 天前 via Android
重写 get_form_kwargs ,把 requeest.user 加进去,然后就可以在 EditTopicForm 的__init__拿到了
(我没试过) |
6
mylifcc 132 天前
self.request.user 不就行了
|
8
coolair 132 天前
class EditTopicForm(forms.ModelForm):
def form_valid(self, form): print(self.request.user) return super().form_valid(form) |
9
lybcyd 132 天前
可以说一下目的吗?需要当前用户信息做什么样的事情
|
11
python30 OP @lybcyd 目的是这样的,
用户发布信息后,修改信息会扣除发布者的积分。 如果是管理员给用户修改信息。则不会扣除用户的积分 这里的 inst.author 是发布者 所以想取得当前登录用户 admin ,做个判断 是 admin 修改信息就不扣除或扣 admin 的积分。而不是扣用户发布者的积分 |
12
lybcyd 132 天前
@python30 这个功能应该写在 view 里,form 的 save 应该只负责表单内的 Topic 数据的保存。前面提到的 form_valid 也不是 form 的方法,而是 CreateView/UpdateView 的方法。在 View 里重写 form_valid 方法,先执行父类的 form_valid 保存数据,然后拿到用户并视情况与否更新积分,最后重定向。别忘了加上事务。
|
13
python30 OP @lybcyd 已经解决了。谢谢
综合上面的朋友们的建议,主要是 @sduoduo233 在 views.py 里 def get_form_kwargs(self, *args, **kwargs): kwargs = super().get_form_kwargs() kwargs.update({'request':self.request}) return kwargs 然后在 forms.ModelForm 的__init__里面用这个取: self.request = kwargs.pop('request', None) 就可以在后面的 save 里面用了 感谢各位 |
14
lybcyd 132 天前
https://gist.github.com/lybcyd/5663a7bc15303dbda9cf5dafa5de63c4
大义如上,根据你的实际代码更改一下 |
15
pililink 132 天前
request.user
|
16
zonde306 132 天前
可以自己写一个 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() ``` |
17
zonde306 132 天前
|
18
HashV2 131 天前
打个断点看看上下文,valid 相关的钩子函数应该可以拿到,如果拿不到建议这块逻辑挪到 serializer 里
|