You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决Django Admin中URLField加载缓存值的问题?

Django Admin URLField 异常自动加载值问题解决

问题回顾

使用Django开发并通过Apache部署的网站,在Admin界面修改模型时,某个URLField会在页面重载时自动加载一个值(但数据库中该字段为null),若未清空就保存,这个值会被存入数据库,不符合预期。已排除get_form方法的初步嫌疑,且CTRL+F5刷新无效。

解决方案

  • 补全get_form的逻辑分支
    原代码仅在yt_video_id存在时设置初始值,但未处理yt_video_id为空的情况,导致Form字段可能保留之前的缓存值。修改代码如下:

    def get_form(self, request, obj=None, change=False, **kwargs):
        form = super(ResourceAdmin, self).get_form(request, obj, change, **kwargs)
        if obj and obj.yt_video_id:
            form.base_fields['youtube_url'].initial = f'https://www.youtube.com/watch?v={obj.yt_video_id}'
        else:
            # 显式清空初始值,避免缓存残留
            form.base_fields['youtube_url'].initial = ''
        return form
    
  • 检查模型字段的default配置
    确认模型中youtube_url字段是否设置了不必要的default值。如果有类似default='某个URL'的设置,即使数据库为null,表单加载时也会调用默认值。确保配置为:

    youtube_url = models.URLField(null=True, blank=True)
    # 或明确设为空字符串,避免默认值干扰
    youtube_url = models.URLField(null=True, blank=True, default='')
    
  • 清除Admin表单缓存
    Django Admin会缓存表单类,修改字段逻辑后可能未更新缓存。直接重启Apache服务,或者在Django 4.2+版本中执行命令清除缓存:

    python manage.py clearcache
    
  • 禁用浏览器自动填充
    浏览器的表单自动填充可能记住了历史输入值,即使页面缓存清除也会自动填入。在ModelAdmin中给URLField添加禁用自动填充的属性:

    from django import forms
    from django.contrib import admin
    from .models import Resource
    
    class ResourceAdmin(admin.ModelAdmin):
        formfield_overrides = {
            models.URLField: {'widget': forms.URLInput(attrs={'autocomplete': 'off'})},
        }
        # 其他原有代码...
    

内容的提问来源于stack exchange,提问作者Luca

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 00:20:31