当前位置: 首页 > 知识库问答 >
问题:

django - 如何在Django中根据编辑信息的内容扣除用户积分?

姚信鸥
2024-06-19

问一个 django 编辑信息扣除相应用户积分的问题

class EditTopicForm(forms.ModelForm):    def __init__(self, *args, **kwargs):        self.user = kwargs.pop('user', None)        self.topic_id = kwargs.pop('topic_id', None)        #以上两条语句取不到相应的值        super(EditTopicForm, self).__init__(*args, **kwargs)            class Meta:        model = Topic        #fields = "__all__"        fields = ['title', 'body', 'ys_t','is_cuti']    def save(self, commit=True):        inst = super(EditTopicForm, self).save()                if inst.is_cuti:            inst.author.levels -= 2            inst.author.save(update_fields = ['levels'])        if inst.ys_t:            inst.author.levels -= 2            inst.author.save(update_fields = ['levels'])        return inst

本意是用户发布信息后,编辑信息时如果给标题“加粗”,变“颜色”时就会扣除用户积分 2,如果不做此操作的话就不扣除积分

问题是如果用户本身就已经“加粗”或变颜色了。那再编辑信息只改其它如标题或内容时,这样的情况就不再扣积分了。

如上面代码只要编辑信息就会扣除相应的积分。

我现在想到的办法:

  1. 把加粗或变色单独写一个操作函数。
  2. 在 models 或 forms 里 在修改信息时 直接在 def save() 里实现。就是先取到修改前信息的 is_cutiys_t 字段的值跟修改后的值做比较后再决定是否执行扣积分问题

现在不知道怎么先取到修改前的值? 如上面所示代码都是取到的修改后的值。

在构造函数里 __init__ 里取不到东西。也可能我写的代码不对

不知道哪位朋友有什么方法能实现这个功能吗?
多谢了

共有2个答案

田英卓
2024-06-19

可以简单理解为,怎么将这个操作做成一个幂等操作

用户对内容(cid)可以随便编辑,当触发某个操作(op)时,扣减积分。是否清除之后,会恢复积分?

cid + op 作为一个唯一值,每次扣减时,判断下是否存在(已扣减过),没有则扣减并新增一条扣减记录。当然这属于一个事务。

同时,还可以将这个数据冗余至 内容 中,比如xx_is_cutixx_ys_t 当这个内容发生过扣减就置为1。每次扣减时判断是否为1?


也就是 将扣减状态持久化下来,并与具体内容做关联。不容易出错,同时也比较好回溯

白念
2024-06-19

要在Django中实现根据编辑信息的内容扣除用户积分的功能,并且只在信息的内容有所改变(比如标题加粗或变色)时才扣除积分,你可以通过比较编辑前后的模型字段值来决定是否扣分。

首先,你需要获取到编辑前的Topic实例的is_cutiys_t字段的值。这通常意味着在编辑操作之前,你需要先从数据库中检索出原始的Topic对象。

这里有一个简单的实现方法:

  1. 在视图中,先从数据库中获取原始的Topic对象。
  2. 使用这个原始对象创建一个表单实例,并且绑定请求的数据。
  3. 在表单的save方法中,比较原始对象和即将保存的对象之间的is_cutiys_t字段的值。
  4. 如果字段值发生了变化,则执行扣除积分的操作。

以下是一个简化的示例代码:

视图(views.py):

from django.shortcuts import get_object_or_404, renderfrom .models import Topicfrom .forms import EditTopicFormdef edit_topic(request, topic_id):    topic = get_object_or_404(Topic, pk=topic_id)    if request.method == 'POST':        form = EditTopicForm(request.POST, instance=topic, user=request.user)        if form.is_valid():            original_is_cuti = topic.is_cuti            original_ys_t = topic.ys_t            topic = form.save()                        # 比较原始值和保存后的值            if topic.is_cuti != original_is_cuti or topic.ys_t != original_ys_t:                # 如果值改变了,则扣除积分                request.user.levels -= 2  # 假设用户模型有levels字段表示积分                request.user.save(update_fields=['levels'])                        # 重定向或返回成功消息            return redirect('topic_detail', topic_id=topic.id)    else:        form = EditTopicForm(instance=topic, user=request.user)        # 渲染表单    return render(request, 'edit_topic.html', {'form': form})

表单(forms.py):

from django import formsfrom .models import Topicclass EditTopicForm(forms.ModelForm):    class Meta:        model = Topic        fields = ['title', 'body', 'is_cuti', 'ys_t']    def __init__(self, *args, **kwargs):        self.user = kwargs.pop('user', None)        super(EditTopicForm, self).__init__(*args, **kwargs)    def save(self, commit=True):        # 在这里,你不需要检查is_cuti或ys_t字段,因为比较逻辑已经在视图中处理了        return super(EditTopicForm, self).save(commit=commit)

请注意,这个示例假设Topic模型有一个author字段,它关联到用户(User)模型,并且用户模型有一个levels字段来表示积分。你需要根据你的实际模型结构来调整这些字段名。

在上面的代码中,我们首先通过get_object_or_404获取到原始的Topic对象。然后,我们使用这个对象来创建表单实例,并绑定请求的数据。在表单验证通过后,我们比较原始Topic对象的is_cutiys_t字段与即将保存的对象中的相应字段。如果检测到变化,则扣除用户积分。

请根据你的具体需求调整上述代码,并确保你的模型结构和字段名称与代码中的假设相匹配。

 类似资料:
  • 接口说明 该接口由开发者开放给变现猫,变现猫进行调用 当用户发起余额支付请求后,变现猫将会创建一个订单,然后发起该用户的积分扣除请求给开发者。 这个请求会包含用户id,变现猫订单号,扣除的积分数等信息。开发者收到该请求后对签名进行校验。校验通过后请自行在自己系统中创建订单,并记录请求中的相关信息,同时执行用户积分扣除动作。 如果扣除成功,写入成功的参数和开发者系统的订单号,返回这个响应给变现猫。

  • 问题内容: 我是django的新手,所以对我的新手问题感到抱歉,我 有一个模型,我需要让用户使用django表单或任何其他方式在其中编辑数据。 看上面的图像,我想显示此表单,其中已准备好填充数据,并让用户对其进行更新。 做这个的最好方式是什么 ? 编辑:这是我的views.py代码 请帮忙 问题答案: 假设你使用,请使用关键字参数,并传递你要更新的模型。 因此,如果你具有和(后者必须扩展),那么你

  • 接口说明 该接口由开发者开放给变现猫,变现猫进行调用 不管积分扣除行为最终成功还是失败,变现猫都会向开发者发出通知。 开发者收到通知后,请以变现猫订单号 orderNum 为准进行处理,改变订单状态,如果扣除成功,开发者在系统内标记此订单为成功状态即可。如果扣除失败,开发者需要将该订单标记为失败,并将之前扣积分接口预扣的积分返还给用户。 无论接受到的结果如何,只要开发者收到该请求,请返回 ok 字

  • 问题内容: 我开始组织一个新项目,假设我将拥有一些模型,例如产品和目录。 我将允许我的客户(不是访问者,仅特定客户)登录Django Admin网站以创建,编辑和删除自己的目录。 假设我创建了一个名为“商店”的模型,创建了每个商店(名称,地址,徽标,联系信息等),并创建了绑定到该商店的管理员用户。 现在,我希望这个新管理员(不是站点管理员,而是商店管理员-可能是用户组)仅查看和编辑与他的商店链接的

  • 我正在工作的一个工作门户项目和招聘人员可以张贴一个实习。之后,他可以选择编辑他的文章以及。为此,我显示一个表单。(顺便说一句,我不使用Django表单)。我想在表单输入字段中显示存储在db中的值。我得到的问题为收音机,下拉列表,ckeditor文本字段和一个动态输入字段的技能。拜托,伙计们,你们能帮忙吗? 下面是我的代码片段:

  • 我有两个下拉菜单,我想检索它的值,将它们用作变量,以过滤从内部Web API检索到的数据。 意见。派克 我没有使用Django表单,因为我没有保存年份以外的任何其他数据,我正在生成周数,但是,如果你认为使用Django表单来促进数据处理可能是有用的,那么写下你的观点,我想让这个网络应用更好。 标题。html 警告:我担心生成周数的代码是完全错误的,因为它不是正确的解决方案,我已经阅读了以下文章Dj

  • 问题内容: 我已经创建了Django网站,但是我喝了Koolaid,并且想要创建iPhone版本。经过深思熟虑后,我提出了两种选择: 制作其他网站,例如i.xxxx.com。使用Django的站点框架将其绑定到同一数据库中。 寻找一些中间件时间来读取用户代理,并动态更改模板目录。 但是,我真的更喜欢选项2。我有所保留,主要是因为Django文档不鼓励动态更改设置。我发现了一个片段,可以满足我的需求

  • 问题内容: 我对Java脚本很陌生,因此如果这很基本,我必须道歉。 如何使用Angularjs在Smart-Table中编辑行表?新的Smart- Table似乎没有教程。我想为用户创建一个简单的表格,以输入特定地点的开放时间。 我创建了可以在表上添加和删除行的按钮,但是当我添加contenteditable =“ true”时,更新对象时所有更改都不会保留。我知道contenteditable是