【问题标题】:Create model using Abstract model with approve system使用带有批准系统的抽象模型创建模型
【发布时间】:2023-03-05 05:42:01
【问题描述】:

我将使用https://github.com/ghdpro/animesuki/tree/master/animesuki/history 并在我自己下面修改它,但我停在了一个我无法用我的技能跳跃的地方..

关键是如果我是超级用户,或者我有这个模型中给定的权限,它会添加到我的主模型电影记录中,如果它没有权限添加,它只会添加到 ChangeRequest,我的问题是如何在批准添加到主电影模型后执行此操作,并且在接受和更改字段时,更新给定对象中的数据。 它或多或少按我的意愿工作,但我不能跳过这一步..

我不需要完整的解决方案,只需要提示或一些我可以从中学习如何做到这一点的源代码

编辑:

class Movie(HistoryModel):
    title = models.CharField(max_length=200, unique=True)
    slug = extension_fields.AutoSlugField(populate_from='title', blank=True)
    description = models.TextField(max_length=2000, default='', blank=True)
    picture = ImageField(upload_to=user_directory_path, default='img/movie/default/brak_obrazka.jpg', blank=True)
    pub_date = models.DateField(blank=True, null=True)
    mpaa = models.CharField(max_length=5, choices=AGE_GROUP, default='PG-13')
    movie_time = models.CharField(max_length=20, default='90')

我的问题是,目前普通用户添加 Movie 仅添加到上面给出的链接中的 ChangeRequest 模型中,从 Pending = Approved 更改后,如何将此模型添加到 Movie,然后如果添加更改以更新给定型号

【问题讨论】:

  • 嗯..我不明白你的问题。你能描述更多关于你的问题吗?你也可以上传你的模型吗?
  • 我在帖子中添加了编辑,看看吧
  • 好的,谢谢,我会看到的。

标签: django django-models django-contenttypes


【解决方案1】:

我没有看到完整的代码,但我认为你应该看看HistoryModel

如您所见,hereHistoryModelsave()save_related() 方法。

您应该在这里查看以了解下面发生的情况。

def save(self, *args, **kwargs):
    self._cr = self.create_changerequest()
    if self.self_approve and self.sanity_checks and self.sanity_checks_extra:
        # Approve immediately if right conditions are met
        self._cr.status = ChangeRequest.Status.APPROVED
    self._cr.save()
    # Save actual model instance if: ChangeRequest object was saved -and- the request was self-approved
    # (ChangeRequest object will not have been saved if data was not altered)
    if self._cr.pk:
        self.log()
        if self._cr.status == ChangeRequest.Status.APPROVED:
            super().save(*args, **kwargs)
            self._cr.set_object(self)
            self._cr.save()
            # Generate message
            verb = {ChangeRequest.Type.ADD: 'Added',
                    ChangeRequest.Type.MODIFY: 'Updated'}  # DELETE or RELATED requests shouldn't be handled by save()
            self.add_message(messages.SUCCESS, verb[self._cr.request_type], self._cr.object_type, self._cr.object_str)
        elif self._cr.status == ChangeRequest.Status.PENDING:
            self.add_message_pending()
    # Reset cached property
    if hasattr(self, 'has_pending'):
        delattr(self, 'has_pending')

def save_related(self, formset):
    self._cr = self.create_changerequest(request_type=ChangeRequest.Type.RELATED)
    self._cr.related_type = ContentType.objects.get_for_model(formset.model)
    self._cr.data_revert = formset_data_revert(formset)
    self._cr.data_changed = formset_data_changed(formset)
    if self.self_approve and self.sanity_checks and self.sanity_checks_extra:
        # Approve immediately if right conditions are met
        self._cr.status = ChangeRequest.Status.APPROVED
    self._cr.save()
    # Save formset if: ChangeRequest object was saved -and- the request was self-approved
    # (ChangeRequest object will not have been saved if data was not altered)
    if self._cr.pk:
        self.log()
        if self._cr.status == ChangeRequest.Status.APPROVED:
            formset.save()
            # Generate message(s)
            for obj in formset.new_objects:
                self.add_message(messages.SUCCESS, 'Added', self._cr.related_type, obj)
                self.log('Add', format_object_str(self._cr.related_type, obj, obj.pk))
            for obj in formset.changed_objects:
                self.add_message(messages.SUCCESS, 'Updated', self._cr.related_type, obj)
                self.log('Modify', format_object_str(self._cr.related_type, obj, obj.pk))
            for obj in formset.deleted_objects:
                self.add_message(messages.SUCCESS, 'Deleted', self._cr.related_type, obj)
                self.log('Delete', format_object_str(self._cr.related_type, obj, obj.pk))
            # Refresh data_changed: any new instances should now have a pk set
            self._cr.data_changed = formset_data_revert(formset)
            self._cr.save()
        elif self._cr.status == ChangeRequest.Status.PENDING:
            self.add_message_pending()
    # Reset cached property
    if hasattr(self, 'has_pending'):
        delattr(self, 'has_pending')

【讨论】:

  • 是的,我现在谈到这个,但我不知道我应该在 ContentType 模型中添加什么来添加模型,因为我不想只将它用于电影模型:>
猜你喜欢
  • 2016-04-03
  • 2019-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-16
  • 1970-01-01
  • 2016-01-10
相关资源
最近更新 更多