Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django models Django:从管理视图更改模型字段_Django Models_Django Admin - Fatal编程技术网

Django models Django:从管理视图更改模型字段

Django models Django:从管理视图更改模型字段,django-models,django-admin,Django Models,Django Admin,我想知道如何更改模型字段的参数,不是在模型初始化期间,而是从模型管理员处更改。例如,我想根据get参数将字段“foo”或“bar”设置为可选字段(想知道#伪代码位的正确解决方案): 您可能会遇到问题,因为许多字段的属性都是在数据库级别表示的(即,如果对具有null=False的字段执行manage.py syncdb,则创建数据库字段的DDL将具有NOT null)。动态更改数据库约束的行为几乎是不可能的 我更喜欢的处理您所描述内容的方法是在表单级别,而不是在模型级别。我的模型将是通用的,并允许

我想知道如何更改模型字段的参数,不是在模型初始化期间,而是从模型管理员处更改。例如,我想根据get参数将字段“foo”或“bar”设置为可选字段(想知道#伪代码位的正确解决方案):


您可能会遇到问题,因为许多字段的属性都是在数据库级别表示的(即,如果对具有
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']