首页 > 解决方案 > 在 Django 中从模型创建确认消息

问题描述

我在 Django 中有一个具有多个模型的应用程序。我有一个像这样的特定模型:

模型.py

class MyModel(models.Model):
model_id= models.AutoField(primary_key=True)
model_date = models.DateTimeField(verbose_name="Label 1")
model_counter = models.IntegerField(blank=True, null=True)

管理员.py

class MyModelAdmin(admin.ModelAdmin):
list_display = ('model_id', 'model_date ', 'model_counter ')
list_filter = (
    ('model_date', DropdownFilter)
)    
def has_delete_permission(self, request, obj=None):
    return False
def get_actions(self, request):
    actions = super().get_actions(request)
    if 'delete_selected' in actions:
        del actions['delete_selected']
    return actions
readonly_fields = ['model_counter ']
admin.site.register(MyModel, MyModelAdmin)

我需要的是用户确认他想要保存模型,即使日期大于今天,这样做用户可以创建一个对其他用户可能是错误的模型,但有时日期是正确的比今天更大。

我不能使用自定义 HTML 表单,只能使用默认表单。

用户必须以某种方式与页面进行交互,并直接承认他知道这会保存一个可能对其他用户造成危险的新模型。用户必须能够中止保存或修改日期。所以我尝试使用模型的另一个字段来存储计数器:

def clean(self):
    condition = False
    if self.model_counter is None:
        condition = True
    else:
        condition = self.model_counter == 1

    if condition :
        self.model_counter = 1
        raise ValidationError("Attention, the date inserted is after the current date, click the SAVE button another time to proceed with the saving")

作为计数器,我使用相同模型的另一个字段。我无法使计数器的更新工作。据我了解,验证的生命周期阻止我以正确的方式更改它正在保存的代码的模型的状态状态,因此忽略了字段模型的更新。有什么方法可以实现我的目标?我使用模型字段来存储计数器的值,因为我无法以其他方式。我不在乎柜台在哪里。我也不关心使用 Django 的消息系统或弹出窗口。我只需要在某种情况下强制用户进行交互,强制他继续或中止保存。

编辑 我还在 admin.py 中添加了代码以更清晰。我只修改了模型和管理员,调用命令:python3 manage.py inspectdb > models.py并生成了所有代码。这是我公司处理这些事情的标准程序。所以我不能向从 Django 生成的网页添加(或者我不怎么添加)代码。

标签: pythondjangodjango-modelsdjango-viewsdjango-admin

解决方案


我认为你最好在这里使用一些 JavaScript。您将click事件添加到模式/对话框要求用户确认的提交按钮的位置。如果他们说是,那么您可以提交表格。

例如使用对话框(如果需要,可以将其设为模态):

HTML

<form id="myModelForm" method="POST">
  {% csrf_token %}
  {{ form.as_p }}
  <button id="myModelSave">{% trans "Save" %}</button>
</form>

JS

let saveButton = document.getElementById('myModelSave');
saveButton.onclick = function() {
    let accepted = confirm("Are you sure you want to save?");
    if (accepted) {
        document.getElementById('myModelForm').submit();
    }
}

推荐阅读