Django admin formfield_for_dbfield提升多次

2024-05-13 20:57:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我想更改django管理站点中myfield字段的默认小部件。我需要一个select小部件,而不是input。该代码运行良好:

在管理员py公司名称:

from django.contrib import admin
from django import forms
from .models import MyModel

CHOICES = (
    ("hello", "hello"),
    ("world", "world")
)

class MyModelAdmin(admin.ModelAdmin):
    def formfield_for_dbfield(self, db_field, **kwargs):
        print("Raised: ", db_field, kwargs['request'])
        if db_field.name == 'myfield':
            kwargs['widget'] = forms.Select(choices=CHOICES)
        return super(MyModelAdmin, self).formfield_for_dbfield(db_field, **kwargs)

admin.site.register(MyModel, MyModelAdmin)

在模型.py公司名称:

^{pr2}$

但有一个问题。formfield_for_dbfield函数在添加/编辑页面打开时多次提升。单个GET请求有一个日志条目:

...
[22/Dec/2015 17:16:34] "GET /static/admin/js/vendor/xregexp/xregexp.min.js HTTP/1.1" 200 62474
[22/Dec/2015 17:16:34] "GET /static/admin/img/tooltag-add.svg HTTP/1.1" 200 331
Raised:  testapp.MyModel.id <WSGIRequest: GET '/admin/testapp/mymodel/add/'>
Raised:  testapp.MyModel.myfield <WSGIRequest: GET '/admin/testapp/mymodel/add/'>
Raised:  testapp.MyModel.myfield <WSGIRequest: GET '/admin/testapp/mymodel/add/'>
Raised:  testapp.MyModel.id <WSGIRequest: GET '/admin/testapp/mymodel/add/'>
Raised:  testapp.MyModel.myfield <WSGIRequest: GET '/admin/testapp/mymodel/add/'>
[22/Dec/2015 17:16:39] "GET /admin/testapp/mymodel/add/ HTTP/1.1" 200 5433
[22/Dec/2015 17:16:39] "GET /static/admin/css/forms.css HTTP/1.1" 200 7750
...

有五个调用formfield_for_db_field,其中三个与myfield有关。为什么会这样?在我的项目中,我有一个可调用的方法而不是选项,所以我不想在每次请求的结果中多次引发它。在


Tags: addfieldfordbgetadmindeckwargs
1条回答
网友
1楼 · 发布于 2024-05-13 20:57:01

我找到了更准确的方法来获得这种行为。关键是使用带有重写的__init__方法的自定义表单,因此所有字段都可以动态修改,并且每个请求只修改一次。这是的更新版本管理员py公司名称:

from django.contrib import admin
from django.forms import ModelForm, Select
from .models import MyModel


CHOICES = (
    ("hello", "hello"),
    ("world", "world")
)

class MyModelForm(ModelForm):
    def __init__(self, *args, **kwargs):
        super(MyModelForm, self).__init__(*args, **kwargs)
        self.fields['myfield'].widget = Select(choices=CHOICES)
    class Meta:
        model = MyModel
        fields = ('myfield',)

class MyModelAdmin(admin.ModelAdmin):
    form = MyModelForm

admin.site.register(MyModel, MyModelAdmin)

{cd2>函数只能被一次调用。在

相关问题 更多 >