我使用模型表单让用户将数据放入数据库。此表单排除了用户字段,因此用户无法自行更改。
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()
因此,用户字段被排除在验证之外。现在,在用户字段和另一个字段之间存在unique_together。
class Meta:
unique_together = ('user', 'name',)
由于排除了用户字段,因此不会对unique_together进行验证。因此,在保存实例时,可能存在IntegrityError。
我被困的地方 所以我的第一个想法是检查数据库是否已存在CharField,如果是,只需通过添加一个数字进行更改并再次检查。但是,如果我这样做,向上计数攻击者可能会插入很多类似的字符串,所以我的服务器必须无限期地进行此检查。
可能的解决方案: 所以对我来说,有两个可接受的解决方案:要么将CharFields值更改为肯定不存在的东西,而不先尝试很多。或者使验证失败并将表单返回给用户。
我尝试了什么: 我认为第二个是理想的,但由于我使用模型formset并且无法将请求用户传递给表单,因此我不可能这样做: 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"
任何想法如何解决?如果您在此处阅读,请感谢您的帮助:)
答案 0 :(得分:0)
if request.method == 'POST':
server = Server(user=request.user)
form = ServerForm(request.POST, instance=server)
if form.is_valid():
f = form.save()
f.name = slugify(f.name)
f.save()
else:
messages.error(request,
' '.join([v[0].__str__() for k, v in form.errors.items()]))