如何在Django中自动更改IntegrityError上的db输入?

时间:2014-10-02 05:33:22

标签: django django-forms django-1.7

我使用模型表单让用户将数据放入数据库。此表单排除了用户字段,因此用户无法自行更改。

  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"

任何想法如何解决?如果您在此处阅读,请感谢您的帮助:)

1 个答案:

答案 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()]))