我们说我有以下型号:
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,这看起来不干净。
那么用所有字段验证模型的最佳方法是什么,即使它们未包含在向用户显示的表单中?
答案 0 :(得分:0)
为什么要验证字段中没有使用的字段?
清洁过程是检查用户发布的数据的方法。必须在>>表单验证
之后添加模型操作所需的其余数据 if form.is_valid():
new = form.save(commit=False)
new.user = request.user
...
new.save()