gpt4 book ai didi

Django 管理员 : Overriding Initial Value for Inlines

转载 作者:行者123 更新时间:2023-12-02 01:23:38 26 4
gpt4 key购买 nike

我的一个模型有一个默认值的字段,我很满意,但我希望该默认值在管理员中有所不同。这是我实现这一目标的尝试:

模型.py

from django.db import models


class Parent(models.Model):
parent_field_1 = models.CharField(max_length=255)
parent_field_2 = models.CharField(max_length=255, blank=True)

class Meta:
ordering = ('pk',)

def __unicode__(self):
return self.parent_field_1


class Child(models.Model):
parent = models.ForeignKey(Parent)
child_field_1 = models.CharField(max_length=255)
child_field_2 = models.CharField(max_length=255, blank=True)
child_field_3 = models.IntegerField(default=0)

class Meta:
ordering = ('pk',)
verbose_name_plural = 'children'

def __unicode__(self):
return self.child_field_1

表格.py
from django import forms

from .models import Child


class ChildForm(forms.ModelForm):
class Meta:
model = Child
fields = [
'parent',
'child_field_1',
'child_field_2',
'child_field_3',
]

def __init__(self, *args, **kwargs):
if 'instance' not in kwargs:
initial = kwargs.get('initial', {})
initial['child_field_3'] = '1'
kwargs['initial'] = initial

super(ChildForm, self).__init__(*args, **kwargs)

管理文件
from django.contrib import admin

from .forms import ChildForm
from .models import Parent, Child


class ChildInline(admin.StackedInline):
model = Child
form = ChildForm


class ParentAdmin(admin.ModelAdmin):
inlines = [ChildInline]


class ChildAdmin(admin.ModelAdmin):
form = ChildForm

admin.site.register(Parent, ParentAdmin)
admin.site.register(Child, ChildAdmin)

当我去添加一个 child 时,“Child field 3”字段填充了“1”(而不是模型的默认值“0”),这就是我想要的。当我去编辑一个 child 时,“Child field 3”字段填充了数据库中的任何值,这也是我想要的。

当我添加或编辑父项时,我遇到的问题就出现了。如果我尝试添加父级,我还需要填写所有子级内联表单。同样,如果我尝试编辑父级,我需要填写所有额外的子级内联表单。如果我注释掉 ChildInline类(class)' form = ChildForm行,我得到了正确的行为,但是,当然,不正确的默认值(“0”而不是“1”)。如何获得正确的行为和正确的默认值?

最佳答案

您的字段是 IntegerField .您必须设置 initial为整数。

当表单被允许为空时(这里就是这种情况),full_cleandismissed if the form did not change . has_changed() changed_data 的空性决定.

字段更改由 field.has_changed(initial, data) 决定数据通过的地方 field.to_python(value) , 在 IntegerField 的情况下返回一个整数.另一方面,initial应该是正确的类型,并按提供的方式保存。这导致了一个比较:has_changed = ('1' != 1) ,返回 True ,而您预计它会返回 False .

关于Django 管理员 : Overriding Initial Value for Inlines,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38488344/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com