首页 > 解决方案 > Django Admin:将初始数据提供给表单字段

问题描述

我需要通过管理面板手动向数据库添加一个条目,但管理员应该无法设置所有值:

#models.py
class Product(models.Model):
    price = models.DecimalField("price")
    status = models.PositiveIntegerField("status")
    name = models.CharField("name", max_length=31, unique=True)

## tried:
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.initial['status'] = 2

#admin.py
class ProductForm(forms.ModelForm):
    class Meta:
        model = Product
        fields = ["price", "name",]

@admin.register(Product)
class ProductAdmin(admin.ModelAdmin):
    form = ProductForm

## tried:
    def get_changeform_initial_data(self, request):
        return {'status': 99}

管理员应该能够创建 aProduct并给它一个nameand price,但status值应该设置为0. 我已经尝试过这种方法和this,但没有成功。

我试过了:

  1. 使用__init__方法添加初始值
  2. get_changeform_initial_data()添加状态的方法。

我总是以sqlite3.IntegrityError: NOT NULL constraint failed: _TEST_Product.status.

编辑:我知道这可以通过在模型中设置默认值来完成,但这不是我想要的 - 我想在管理员中设置它。

标签: djangodjango-formsdjango-admin

解决方案


编辑

由于您不想使用该default字段,因此您应该从这个答案中尝试这种方法。

class ProductAdmin(admin.ModelAdmin):
    form = ProductForm

    def save_model(self, request, obj, form, change):
        obj.status = 0
        super().save_model(request, obj, form, change)

为什么不直接使用该default字段?

status = models.PositiveIntegerField("status", default=0)

推荐阅读