Django models Django:从管理视图更改模型字段
我想知道如何更改模型字段的参数,不是在模型初始化期间,而是从模型管理员处更改。例如,我想根据get参数将字段“foo”或“bar”设置为可选字段(想知道#伪代码位的正确解决方案):Django models Django:从管理视图更改模型字段,django-models,django-admin,Django Models,Django Admin,我想知道如何更改模型字段的参数,不是在模型初始化期间,而是从模型管理员处更改。例如,我想根据get参数将字段“foo”或“bar”设置为可选字段(想知道#伪代码位的正确解决方案): 您可能会遇到问题,因为许多字段的属性都是在数据库级别表示的(即,如果对具有null=False的字段执行manage.py syncdb,则创建数据库字段的DDL将具有NOT null)。动态更改数据库约束的行为几乎是不可能的 我更喜欢的处理您所描述内容的方法是在表单级别,而不是在模型级别。我的模型将是通用的,并允许
您可能会遇到问题,因为许多字段的属性都是在数据库级别表示的(即,如果对具有
null=False
的字段执行manage.py syncdb
,则创建数据库字段的DDL将具有NOT null
)。动态更改数据库约束的行为几乎是不可能的
我更喜欢的处理您所描述内容的方法是在表单级别,而不是在模型级别。我的模型将是通用的,并允许所有允许的状态(例如,如果在某些情况下字段可以为null,但在其他情况下不能为null,只需设置null=True
)。然后,我会动态地修改一个django.form
实例来更改它的验证方式,或者在我的视图中手动执行验证。您甚至可以创建一个表单的实例,每个实例都有稍微不同的约束,并根据GET决定使用哪一个。在伪代码中:
def view(request):
if request.GET.get('object_type', 'foo') == 'foo':
f = FooForm(request) # FooForm let's bar be blank, while foo can not be blank
if f.is_valid():
a = f.cleaned_data['a']
...
else:
f = BarForm(request) # BarForm let's foo be blank, while bar can not be blank
if f.is_valid():
a = f.cleaned_data['a']
def view(request):
if request.GET.get('object_type', 'foo') == 'foo':
f = FooForm(request) # FooForm let's bar be blank, while foo can not be blank
if f.is_valid():
a = f.cleaned_data['a']
...
else:
f = BarForm(request) # BarForm let's foo be blank, while bar can not be blank
if f.is_valid():
a = f.cleaned_data['a']