Joh*_*lum 6 django django-admin
我有一个可以通过Django管理区访问的模型,如下所示:
# model
class Foo(models.Model):
field_a = models.CharField(max_length=100)
field_b = models.CharField(max_length=100)
# admin.py
class FooAdmin(admin.ModelAdmin):
pass
Run Code Online (Sandbox Code Playgroud)
假设我想在用户添加对象时显示field_a和field_b,但如果用户正在编辑对象,则只显示field_a.是否有一种简单的方法可以使用fields属性?
如果遇到它,我可能会破解JavaScript解决方案,但根本不这样做是不对的!
您可以ModelForm为管理员创建自定义以删除该字段__init__
class FooForm(forms.ModelForm):
class Meta(object):
model = Foo
def __init__(self, *args, **kwargs):
super(FooForm, self).__init__(*args, **kwargs)
if self.instance and self.instance.pk:
# Since the pk is set this is not a new instance
del self.fields['field_b']
class FooAdmin(admin.ModelAdmin):
form = FooForm
Run Code Online (Sandbox Code Playgroud)
编辑:从约翰关于使字段只读的评论中得到一个提示,你可以将它作为一个隐藏字段并覆盖清理以确保值不会改变.
class FooForm(forms.ModelForm):
class Meta(object):
model = Foo
def __init__(self, *args, **kwargs):
super(FooForm, self).__init__(*args, **kwargs)
if self.instance and self.instance.pk:
# Since the pk is set this is not a new instance
self.fields['field_b'].widget = forms.HiddenInput()
def clean_field_b(self):
if self.instance and self.instance.pk:
return self.instance.field_b
else:
return self.cleaned_data['field_b']
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4511 次 |
| 最近记录: |