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

2024-10-01 15:33:35 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有以下模型:

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-对象,它既没有父对象也没有根FK集。在

我用customclean()创建了一个定制的ModelForm,它的工作原理非常棒(根据unittests和manual testing):

^{pr2}$

因此,由于我的根文件夹只是一个普通的FKs为空的文件夹对象,所以我甚至不想在创建时向用户显示这些字段。我为此创建了另一个表单:

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作为单个表单实例,则无法使用相同的表单来显示和验证排除的字段。在

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

那么,哪种方法是最好的方法来验证所有字段的模型,即使它们没有包含在显示给用户的表单中?在


Tags: 对象方法用户form文件夹true表单models
1条回答
网友
1楼 · 发布于 2024-10-01 15:33:35

为什么不在表单中使用验证字段?在

清理过程是检查用户发布的数据的方法。模型操作所需的其余数据必须在表单验证之后添加到

 if form.is_valid():
     new = form.save(commit=False)
     new.user = request.user
     ...
     new.save()

相关问题 更多 >

    热门问题