python – django – 如何在不覆盖原始条目的情况下保存修改后的表单

python – django – 如何在不覆盖原始条目的情况下保存修改后的表单,第1张

概述我有一个合乎逻辑的“如何”或最佳实践问题. 一个简化的例子 我有一个带文本框的模型类.用户可以添加新条目,但只有管理员接受它们才会显示给其他用户. class MyClass(models.Model): # Relation to a user user = ForeignKey(User) # Simple textbox as example attribute 我有一个合乎逻辑的“如何”或最佳实践问题.

一个简化的例子

我有一个带文本框的模型类.用户可以添加新条目,但只有管理员接受它们才会显示给其他用户.

class MyClass(models.Model):    # Relation to a user    user = ForeignKey(User)    # Simple textBox as example attribute    text = TextArea()    # admin has to accept the entry that other users can see it    accepted = BooleanFIEld(default=False)

问题

我想让用户修改一个列表,但管理员必须先接受它们.只要管理员不接受修改,它仍应显示该条目的旧的未修改版本.

我的方法

a)创建一个新类

class MyEditClass(models.Model)    # ForeignKey to the original class    fk = ForeignKey(MyClass)    user = ForeignKey(User)    text = TextArea()    accepted = BooleanFIEld(default=False)

修改将保存在新的表/类中.如果管理员接受此修改后的条目,则原始条目将成为此条目.

为什么我不喜欢它?我的班级有大约60个属性,有很多关系.由于我没有找到复制完整类的解决方案,因此会产生大量重复的代码行.如果我添加一个新的attr.在MyClass中我还必须在MyEditClass中添加它…

b)如果条目被编辑,则向MyClass添加新的atrribute

class MyClass(models.Model):    # new attribute with the primary key of the edited fIEld    edited_pk = PositiveIntegerFIEld(default=None,blank=True,none=True)    user = ForeignKey(User)    text = TextArea()    accepted = BooleanFIEld(default=False)

在这种情况下,您不创建新类,而是将编辑的条目保存在同一个类中,并添加属性edited_pk.如果条目是新条目集edited_pk =无(默认).如果用户修改条目,则从原始条目获取pk.然后使用edited_pk = original_entry.pk将修改后的一个添加为新条目.如果管理员接受修改后的版本,则原始条目将被修改后的条目覆盖.

为什么我不喜欢这个解决方案?作为管理员,我希望在后端有一个类来接受修改后的条目.

你有其他(也许已经是bultin或第三方)的方法吗?

提前致谢

(标题很糟糕,但我找不到更好的名字.如果你这样做,请编辑)

如果您不想使用第三方应用程序,请检查标记的答案.

我最喜欢的解决方案,也是Obj3ctiv3_C_88需要django-simple-history.
因此我创建了一个方法:

class MyClass(models.Model):    user = ForeignKey(User)    text = TextArea()    accepted = BooleanFIEld(default=False)    history = HistoricalRecords()  # rtd from django-simple-history    def get_accepted(self):        """Return the first entry from the history which is accepted."""        return self.history.filter(accepted=True).first()

在你的意见:

# This code may be optimized,but for Now it worksitems = MyClass.objects.all()items = List(items)  # convert queryset to a Listi = 0for item in items:    # important to get the instance. Otherwise custom methods won't work    items[i] = item.get_accepted().instance    i += 1
解决方法 会这样的吗?

class BlogComment(models.Model):    blog = models.ForeignKey(Blog)    user = models.ForeignKey(User)    unapproved = models.CharfIEld(max_length=1000,default=None,Blank=True)    approved = models.CharfIEld(max_length=1000,Blank=True)# on submitBlogComment.unapproved = request.POST['user_comment']# on approveBlogComment.approved = BlogComment.unapprovedBlogComment.unapproved = NoneBlogComment.save()

这将允许您为同一个注释保留2个不同的状态.您只渲染BlogComment.approved.要查找需要批准的评论,您只需过滤(~Q(未批准=无))

总结

以上是内存溢出为你收集整理的python – django – 如何在不覆盖原始条目的情况下保存修改后的表单全部内容,希望文章能够帮你解决python – django – 如何在不覆盖原始条目的情况下保存修改后的表单所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1197520.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-03
下一篇 2022-06-03

发表评论

登录后才能评论

评论列表(0条)

保存