我正在使用模型表单让用户将数据放入数据库。此表单不包括用户字段,因此用户无法自行更改。
class Meta:
model = Server
exclude = ["user","name", "quirky"]
相反,用户字段的值将在我调用 .save(commit=False) 后输入。
if neuer_server_form.has_changed() and neuer_server_form.is_valid():
neuer_server = neuer_server_form.save(commit=False)
neuer_server.user = request.user
neuer_server.name = slugify(neuer_server.name)
neuer_server.save()
因此,用户字段被排除在验证之外。现在 user 字段和另一个 char 字段之间有一个 unique_together 。
class Meta:
unique_together = ('user', 'name',)
由于排除了用户字段,因此不会对 unique_together 进行验证。因此,在保存实例时可能会出现 IntegrityError。
我被困在哪里: 所以我的第一个想法是检查数据库是否 CharField 已经存在,如果是这样,只需通过添加一个数字来更改它并再次检查。但是如果我向上计数,攻击者可能会插入很多类似的字符串,所以我的服务器必须无限期地做这个检查。
可能的解决方案: 所以对我来说有两个可接受的解决方案:要么将 CharFields 值更改为绝对不存在的东西,而无需先尝试很多。或者使验证失败并将表单返回给用户。
我尝试了什么: 我认为第二个是理想的,但是由于我使用的是模型表单集并且无法将请求用户传递给表单,所以我无法这样做: Django's ModelForm unique_together validation
相反,我想知道是否可以在循环表单集时将自制错误添加到表单中。
有点像这个伪代码:
for form in formset.forms:
if form.is_valid():
server_name = form.cleaned_data.get("name","")
if Server.objects.get(user=request.user,name=server_name).count():
formset.forms[form].errors += "here is my own error message"
formset.forms[form].fields["name"].errors += "this field is wrong"
任何想法如何解决这个问题?如果你读到这里,谢谢你的帮助:)