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

时间:2009-11-24 13:35:08

标签: django-models django-admin

我想知道如何更改模型的字段参数,而不是在模型初始化期间,而是从模型管理员。例如,我想根据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)

1 个答案:

答案 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']