如何根据某些条件更改Django admin中某些类似字段的外观 我想要什么

如何根据某些条件更改Django admin中某些类似字段的外观 我想要什么,django,django-admin,Django,Django Admin,我有三个类型为DateField的字段,如果该字段的值是一个特定的日期,我想更改其在管理中的外观,而无需重复相同的方法来检查每个字段的值并更改其外观(DRY) 我试过的 1.第一种方法:使用模型方法检查字段值 模型 类大小写(timestamesedmodel,models.Model): 履行=models.DateField(默认值=date.today) caducity=models.DateField(默认值为date.today) 处方=models.DateField(默认值=da

我有三个类型为
DateField
的字段,如果该字段的值是一个特定的日期,我想更改其在管理中的外观,而无需重复相同的方法来检查每个字段的值并更改其外观(DRY)

我试过的 1.第一种方法:使用模型方法检查字段值 模型
类大小写(timestamesedmodel,models.Model):
履行=models.DateField(默认值=date.today)
caducity=models.DateField(默认值为date.today)
处方=models.DateField(默认值=date.today)
#使用这种方法,我需要重复这种方法来检查每个字段的值
def是规定的(自我):
“”“检查是否规定了一个病例。”“”
如果self.prescription==date.today():
返回真值
返回错误
管理
来自django.contrib导入管理
从。模型导入案例
@行政登记(个案)
类CaseAdmin(admin.ModelAdmin):
列表显示=(
“_履行”,
“_衰老”,
“_处方”,
)
#使用这种方法,我需要重复这种方法来更改每个字段的外观
def_处方(自身、obj:病例)->str:
“”“对于规定的情况,在管理员中呈现红色徽章警报。”“”
日期=格式。日期\格式(对象处方)
如果规定了目标():
返回创建徽章(文本=日期)
返回日期
2.第二种方法:使用管理器方法同时检查所有字段的值 模型管理器
class CaseManager(models.Manager):
def过期(自身)->“查询集[案例]”:
“”“获得所有满足、指导和规定的案例。”“”
返回self.get_queryset().filter(
Q(实现=今天获得)
|Q(caducity=get_today())
|Q(处方=今天获得)
)
模型
类大小写(timestamesedmodel,models.Model):
# ... 模型文件
objects=CaseManager()
管理
from.models导入案例
@行政登记(个案)
类CaseAdmin(admin.ModelAdmin):
列表显示=(
“_履行”,
“_衰老”,
“_处方”,
)
#使用这种方法,我需要重复这种方法来更改每个字段的外观
def_处方(自身、obj:病例)->str:
“”“对于规定的情况,在管理员中呈现红色徽章警报。”“”
日期=格式。日期\格式(对象处方)
对于case.objects.presided()中的指定大小写:
如果规定_情况==obj:
返回创建徽章(文本=日期)
返回日期
辅助函数 此函数用于在管理员中打印符合条件的日期的红色封条

来自django.utils.html导入格式\u html
def创建_徽章(
text:str=”“,bg_color:str=“番茄”,color:str=“白色”,padding:str=“2”
)->str:
“”“为某些文本创建css标记样式。”“”
徽章=(
f“{text}”
)
返回f“{format_html(badge)}”
问题
  • 第一种方法:第一种方法的问题是,我需要创建三个相同的模型和管理方法来检查每个字段的值,并更改它们在管理中的外观

  • 第二种方法:通过这种方法,我解决了重复三种模型方法来检查每个字段的值的问题,但在管理中,我需要将方法管理器抛出的所有值与每个字段的模型实例的值进行比较,这是低效的。还有一个问题是在管理中更改每个字段的外观,就像第一种方法一样,我应该对每个字段重复相同的方法来更改其外观


  • 也许还有第三种方法:覆盖/替换日期字段的admindatewidget。

    对于django在管理表单中显示的每个字段,都使用一个小部件。 对于日期字段类型字段,使用AdminDateWiget(site packages\django\contrib\admin\AdminDateWiget),它扩展了另一个小部件:

    class DateInput(DateTimeBaseInput):
        format_key = 'DATE_INPUT_FORMATS'
        template_name = 'django/forms/widgets/date.html'
    
    如您所见,默认模板是date.html:

    <input type="{{ widget.type }}" name="{{ widget.name }}"{% if widget.value != None %} value="{{ widget.value|stringformat:'s' }}"{% endif %}{% include "django/forms/widgets/attrs.html" %}>
    

    我不知道
    create_-badge
    应该做什么,但是你考虑过使用javascript读取字段、解析/比较日期、更新外观吗?@Ben我用
    create_-badge
    函数更新我的问题,这个函数只是打印红方块的助手;另一方面,作为对您建议的回应,这可能是一个可行的选择,但是如果我想更改的不是外观,而是使用js更改显示名称或其他可能的更改,那么在知道我有管理功能来执行此任务的情况下,可能会更复杂。在Django admin中重写日期小部件怎么样。并向该自定义模型管理员注册您的模型?类似于formfield_overrides={models.DateField:{“widget”:CustomDateWidget}}您可以更好地解释您的答案,添加更多细节、来源或解释您应用的过程…@CristianFlórez对您合适吗?
    {% now "Y-m-d" as current_time %}
    {% if  widget.value == current_time %}
        <input type="{{ widget.type }}" class='my css' name="{{ widget.name }}"{% if widget.value != None %} value="{{ widget.value|stringformat:'s' }}"{% endif %}{% include "django/forms/widgets/attrs.html" %}>
    {% else %}
        <input type="{{ widget.type }}" name="{{ widget.name }}"{% if widget.value != None %} value="{{ widget.value|stringformat:'s' }}"{% endif %}{% include "django/forms/widgets/attrs.html" %}>
    {% endif %}
    
    class CustomerAdmin(admin.ModelAdmin):
        template_name = "app_name/.../spedate.html"
    
        formfield_overrides = {
            models.DateField: { 'widget': AdminDateWidget },
        }
    
    admin.site.register(Case,CustomerAdmin)