0

我正在使用模型表单让用户将数据放入数据库。此表单不包括用户字段,因此用户无法自行更改。

  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"

任何想法如何解决这个问题?如果你读到这里,谢谢你的帮助:)

4

1 回答 1

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()]))
于 2014-10-02T06:46:29.477 回答