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