Django:如何防止模型表单字段呈现,但将它们包含在验证中?

时间:2015-06-28 08:59:34

标签: python django validation django-forms

我们说我有以下型号:

class Folder(models.Model):
    name = models.CharField(default='untitled', max_length=255)
    parent = models.ForeignKey('self', null=True, blank=True)
    root = models.ForeignKey('self', null=True, blank=True)
    user = models.ForeignKey(settings.AUTH_USER_MODEL)

在我的应用程序中,此类用于表示两种类型的文件夹:普通文件夹对象和所谓的 root_folder 对象,它们没有父级也没有root -FK集

我使用自定义 clean()创建了一个自定义ModelForm,它像魅力一样工作(根据单元测试和手动测试):

class FolderForm(ModelForm):

    def __init__(self, *args, **kwargs):
        try:
            data = kwargs.get('data', None).copy()
        except AttributeError:
            data = None
        self.prefix = kwargs.get('prefix')
        user = kwargs.pop('user', None)

        if data is not None:
            if user is not None:
                data[self.add_prefix('user')] = user.id
            kwargs['data'] = data

        super(FolderForm, self).__init__(*args, **kwargs)

    def clean(self):
        # just working fine, so I won't include it here
        pass

    class Meta:
        model = Folder
        fields = '__all__'

所以,因为我的根文件夹只是一个普通的文件夹 - 具有空白FK的对象,我不想甚至向用户显示这些字段创造时。我为此创建了另一种形式:

class AddRootFolderForm(FolderForm):
    class Meta:
        model = Folder
        exclude = ['parent', 'root', 'user']

如您所见,我也排除了用户,此值将在视图中设置。目前,这是我的观看代码:

@login_required
def create_rootfolder(request):
    if request.method == 'POST':
        form = FolderForm(data = request.POST,
                          user = request.user)
    else:
        form = AddRootFolderForm()

    if form.is_valid():
        new = form.save()
        return redirect('show_rootfolder', root_id = new.id)

    return render(request, 'create_rootfolder.html',
                  { 'form': form })

整个设置工作正常,但看起来很糟糕。有没有更好的方法来隐藏用户的某些字段(意思是:不要将它们显示为隐藏字段),但是将它们包含在验证中?我的主要问题是,我无法使用相同的表单进行显示和验证,因为如果我将 AddRootFolderForm 用作单个表单实例,则不会验证排除的字段。

我知道我可以在构造函数中动态地排除字段,我甚至试过这个,但它让我的构造函数膨胀到50 LOC,这看起来不干净。

那么用所有字段验证模型的最佳方法是什么,即使它们未包含在向用户显示的表单中?

1 个答案:

答案 0 :(得分:0)

为什么要验证字段中没有使用的字段?

清洁过程是检查用户发布的数据的方法。必须在>表单验证

之后添加模型操作所需的其余数据
 if form.is_valid():
     new = form.save(commit=False)
     new.user = request.user
     ...
     new.save()