我想知道如何更改模型的字段参数,而不是在模型初始化期间,而是从模型管理员。例如,我想根据get参数使字段“foo”或“bar”可选(想知道#PSEUDO CODE位的正确解决方案):
def add_view(self, request, form_url='', extra_context=None):
if request.GET.get('object_type', 'foo') == 'foo':
# PSEUDO CODE:
model.fields.foo.blank = False
model.fields.bar.blank = True
else:
# PSEUDO CODE:
model.fields.foo.blank = True
model.fields.bar.blank = False
return super(FileNodeAdmin, self).add_view(request, form_url, extra_context)
答案 0 :(得分:1)
您可能会遇到麻烦,因为许多字段的属性都在数据库级别表示(即,如果您使用manage.py syncdb
字段执行null=False
,则创建数据库字段将具有NOT 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']