【问题标题】:Do Some work before Saving and After Saving data in django Admin在 django Admin 中保存数据之前和之后做一些工作
【发布时间】:2015-05-19 18:36:37
【问题描述】:

我有一个模型类“时事通讯”。可以选择发送给喜欢的学生、老师等。

无论用户选择什么,我都想获取学生或老师的所有电子邮件,然后在按下保存按钮后,获取当前保存的时事通讯的 id 以及所选学生或老师的所有电子邮件,并将其保存到另一个名为 email 的表中日志。

所有这些工作都是在 django 的管理面板上完成的。

class newsletter(models.Model):
    newsletter_id = models.AutoField(primary_key=True)
    subject = models.CharField(max_length=512)
    content = RichTextField()
    send_to_choice = {('0', 'None'), ('1', 'Student'), ('2', 'Teacher')}
    send_to = models.CharField(max_length=128, choices=send_to_choice, default='None')
    created_on = models.DateTimeField(auto_now_add=True)
    created_by = models.EmailField(max_length=254)
    updated_on = models.DateTimeField(auto_now_add=True)
    updated_by = models.EmailField(max_length=254)

当管理员选择一个选项时,应激活查询并显示所选选项的所有电子邮件。我知道查询,但不知道如何在 django 管理面板上实现它。

更新:

我编写了这个简单的函数来测试它是否执行,然后将我的逻辑添加到它。

def save_model(self, request, obj, form, change):
    obj.save()
    if not change:
        if obj.send_to == '1':
            messages.success(request, 'MyModel was saved!.')
            obj.created_by = 'abc@gmail.com'
    if obj.send_to == '1':
            messages.success(request, 'MyModel was saved!.')
            obj.created_by = 'abc@gmail.com'
    obj.save()

【问题讨论】:

    标签: python django django-models django-admin


    【解决方案1】:

    你必须重写 ModelAdmin.save_model() 方法:

    class NewsletterAdmin(admin.ModelAdmin):
    
        def save_model(self, request, obj, form, change):
            obj.save()
            if not change: # newly created newsletter
                if obj.send_to == '1':
                    for student in Student.objects.all():
                        EmailLog.objects.create(student=student, newsletter=obj)
                elif obj.send_to == '2':
                    for teacher in Teacher.objects.all():
                        EmailLog.objects.create(teacher=teacher, newsletter=obj)
    

    【讨论】:

    • 它不起作用,在保存 500 服务器错误后出现,但是我试图注释掉 if 条件中的逻辑并显示成功消息。查看更新后的问题。
    • 设置DEBUG=True 并显示错误的回溯。
    猜你喜欢
    • 2022-01-10
    • 2019-06-20
    • 1970-01-01
    • 2018-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-13
    相关资源
    最近更新 更多