Как автоматически изменить ввод базы данных на IntegrityError в Django?

Я использую форму модели, чтобы позволить пользователю помещать данные в базу данных. Эта форма исключает пользовательское поле, поэтому пользователь не может изменить его самостоятельно.

  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 между пользовательским полем и другим полем char.

  class Meta:
    unique_together = ('user', 'name',)

Поскольку пользовательское поле исключено, не будет проверки для unique_together. Поэтому при сохранении экземпляра может возникнуть ошибка IntegrityError.

Где я застрял. Итак, моя первая идея заключалась в том, чтобы проверить БД, существует ли уже CharField, и если да, просто измените его, добавив число, и проверьте еще раз. Но если я сделаю это в порядке возрастания, злоумышленник может вставить много похожих строк, поэтому моему серверу придется выполнять эту проверку бесконечно долго.

Возможные решения: Таким образом, для меня было бы два приемлемых решения: Либо изменить значение CharFields на что-то, что определенно еще не существует, не пытаясь сначала много. Или сделайте проверку неудачной и верните форму пользователю.

Что я пробовал: я думаю, что второй вариант был бы идеальным, но, поскольку я использую набор форм модели и не могу передать пользователя запроса в форму, я не могу сделать это: Проверка Django ModelForm unique_together

Вместо этого мне было интересно, можно ли добавлять в форму самосовершенные ошибки при циклическом просмотре набора форм.

Что-то вроде этого псевдокода:

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"

Любые идеи, как это решить? Спасибо за помощь, если вы дочитали до сюда :)


person JasonTS    schedule 02.10.2014    source источник


Ответы (1)


person    schedule
comment
Спасибо за ваш ответ. Это даст информацию только через систему сообщений, но не будет правильно использовать функции ошибок форм (например, указать, какое поле неверно)? - person JasonTS; 02.10.2014
comment
Результатом этого сообщения является конкретная ошибка (без имени поля). Если вы хотите показать, в каком поле есть ошибка, вы можете изменить его. Как видите, там есть k&v. Почему бы не проверить это для вас, чтобы увидеть. - person catherine; 02.10.2014